2020-01-11
■ Micro:bitのPythonでモータードライバを動かすサンプル
これのアドレスをSuper:Bitのmain.tsに合わせて書き換えると動きそう
このサンプルも参考になる
http://wiki.labplus.cn/index.php?title=Extend:bit%E2%85%A1
これで動いた
# Add your Python code here. E.g. from microbit import * PCA9685_ADDRESS = 0x40 #device address #define register MODE1 = 0x00 MODE2 = 0x01 SUBADR1 = 0x02 SUBADR2 = 0x03 SUBADR3 = 0x04 PRESCALE = 0xFE LED0_ON_L = 0x06 LED0_ON_H = 0x07 LED0_OFF_L = 0x08 LED0_OFF_H = 0x09 ALL_LED_ON_L = 0xFA ALL_LED_ON_H = 0xFB ALL_LED_OFF_L = 0xFC ALL_LED_OFF_H = 0xFD STP_CHA_L = 2047 STP_CHA_H = 4095 STP_CHB_L = 1 STP_CHB_H = 2047 STP_CHC_L = 1023 STP_CHC_H = 3071 STP_CHD_L = 3071 STP_CHD_H = 1023 # Servos define S1 = 0x01 S2 = 0x02 S3 = 0x03 S4 = 0x04 # Motors define M1 = 8 M2 = 10 M4 = 12 M3 = 14 # device init def initPCA9685(): i2c.write(PCA9685_ADDRESS, bytearray([MODE1, 0x00])) setFreq(50) for idx in range(0, 16, 1): setPwm(idx, 0 ,0) #initialized = true #set frequency def setFreq(freq): #Constrain the frequency prescaleval = int(25000000/(4096*freq)) - 1 #prescale = prescaleval; #Math.Floor(prescaleval + 0.5) i2c.write(PCA9685_ADDRESS, bytearray([MODE1])) oldmode = i2c.read(PCA9685_ADDRESS, 1) newmode = (oldmode[0] & 0x7F) | 0x10 # sleep i2c.write(PCA9685_ADDRESS, bytearray([MODE1, newmode])) # go to sleep i2c.write(PCA9685_ADDRESS, bytearray([PRESCALE, prescaleval])) # set the prescaler i2c.write(PCA9685_ADDRESS, bytearray([MODE1, oldmode[0]])) sleep(4) i2c.write(PCA9685_ADDRESS, bytearray([MODE1, oldmode[0] | 0xa1])) # function: setPwm() def setPwm(channel, on, off): if (channel >= 0 and channel <= 15): buf = bytearray([LED0_ON_L + 4 * channel, on & 0xff, (on >> 8) & 0xff, off & 0xff, (off >> 8) & 0xff]) i2c.write(PCA9685_ADDRESS, buf) # function: motorRun() # @param motor: M1A, M1B, M2A, M2B # @param speed1: -255 - 255 0 is stop def MotorRun(Motors, speed): speed = speed * 16 # map 255 to 4096 if (speed >= 4096): speed = 4095 if (speed <= -4096): speed = -4095 a = Motors b = Motors+1 if (speed >= 0): setPwm(a, 0, speed) setPwm(b, 0, 0) else : setPwm(a, 0, 0) setPwm(b, 0, -speed) while True: initPCA9685() display.show(Image.HEART) for idx in range(0, 120, 1): display.show(idx%10) #MotorRun(M1, idx) sleep(16)
■ M5CameraでGoogle Driveにアップロードする
やってみたい
2020-01-07
■ [Micro:bit] Bluetooth関連の調査
「Buetooth?のジョイスティックコントローラの入力をMicro:bitに伝えたい」
https://tangowhisky37.github.io/KidzCanCode-Tutorials-I/docs/motor_bit_smart_car_case_06.html
■ M5StackでBLEを使う
■ GoogleのEddystoneとはなんなのか
M5StackのBLEScanResults/BLEAdvertisedDeviceはeddystoneを解析できない?
届いた生データを見たいが、別の形式で解釈済みで生データが消えてる(payloadがたまたま開放済みメモリを指してた時に生データっぽいものが偶然見えることがあるが、たぶん不正なアクセス)
生データを取る方法が欲しい
2020-01-06
2020-01-05
当面の課題
- 加速度センサの使い方を調べておく
- M5StackをMicro:Bitのユニバーサル基盤経由でSuper:Bitに接続して代替
- cameraが届いたら映像を送る(が、難度はだいぶ高そうなのでスマホで妥協したほうがいいかも)
- PS3コントローラーの接続
- M5StackとMicro:BitとのBLE通信
- とりあえずつながった。通信はまだ
- https://game.g.hatena.ne.jp/Nao_u/20200113
- M5Stackのサーボモータの制御
- Micro:BitのPythonでSuper:Bitを制御(ユニバーサル基盤が届くまでに、M5StackでC++書くより先にやっておいてもよさそう)
- できたが、micro:bitのPythonではメモリ不足でBLEから使えないのでM5Stackと通信できなくなる
- https://game.g.hatena.ne.jp/Nao_u/20200111
■ 「AquesTalk-ESP32 Ver.2.0」を使う
■ M5Stack LovyanLauncherの使い方
https://raspberrypi.mongonta.com/howto-use-m5stack-lovyanlauncher/
■ ScreenShotSender
■ M5Stackの3Dソフトウェアラスタライザ
2020-01-04
■ M5Stackを分解したり電源を入れてみて、いろいろ思ったこと
https://www.mgo-tec.com/blog-entry-m5stack-initial-operation.html
■ M5Stack-SD-Updaterのすすめ
■ PACMAN with M5STACK
Gameboy Panel は ATmega328P で構成され I2C で通信しています。
アドレスは 0x88 です。
サンプル(faces_joystick)ではなぜか#define FACE_JOY_ADDR 0x5e で定義されていてそのままでは動かず、0x88にしたら動いた
…と思ったけど、なんかそもそも別のサンプルっぽい?アナログを取ってる気配が。
#include#define FACE_JOY_ADDR 0x88 #define KEY_U 0x01 #define KEY_D 0x02 #define KEY_L 0x04 #define KEY_R 0x08 #define KEY_A 0x10 #define KEY_B 0x20 #define KEY_SL 0x40 #define KEY_ST 0x80 char strBuf[100]; int cnt=0; void setup() { randomSeed(analogRead(0)); Serial.begin(115200); M5.begin(); Wire.begin(); M5.Lcd.fillScreen(TFT_BLACK); pinMode(5, INPUT_PULLUP); delay(100); M5.Lcd.setTextFont(2); } uint8_t key_val; void loop() { M5.Lcd.fillScreen(TFT_BLACK); if(digitalRead(5) == LOW) { cnt++; Wire.requestFrom(0X88, 1); // request 1 byte from keyboard while (Wire.available()) { key_val = Wire.read(); // receive a byte as character key_val ^= 0xff; } } M5.Lcd.setCursor(50, 50); sprintf(strBuf, "kay_val : %x cnt : %d\n", key_val, cnt); M5.Lcd.print(strBuf); if( key_val & KEY_U ) M5.Lcd.print("UP "); if( key_val & KEY_D ) M5.Lcd.print("DOWN "); if( key_val & KEY_L ) M5.Lcd.print("LEFT "); if( key_val & KEY_R ) M5.Lcd.print("RIGHT "); if( key_val & KEY_A ) M5.Lcd.print("A "); if( key_val & KEY_B ) M5.Lcd.print("B "); if( key_val & KEY_SL ) M5.Lcd.print("SL "); if( key_val & KEY_ST ) M5.Lcd.print("ST "); delay(1); }
■ M5Stack の液晶ディスプレイ ILI9341 をちょっと解明してみた
■ M5StackでGrove超音波距離センサの値を画面表示
元のサンプルは9600だったが、Serial.begin(115200) にしないといけないらしい。
#include "Ultrasonic.h" #includeUltrasonic ultrasonic(22); void setup() { M5.begin(); Serial.begin(115200); delay(500); M5.Lcd.setTextFont(2); M5.Lcd.setCursor(10, 10); } void loop() { long RangeInCentimeters; Serial.println("The distance to obstacles in front is: "); RangeInCentimeters = ultrasonic.MeasureInCentimeters(); // two measurements should keep an interval M5.Lcd.clear(); M5.Lcd.setCursor(10, 10); M5.Lcd.setTextColor(YELLOW); M5.Lcd.setTextSize(2); M5.Lcd.printf("Ultrasonic distance\n"); M5.Lcd.setCursor(50, 50); M5.Lcd.setTextColor(YELLOW); M5.Lcd.setTextSize(2); M5.Lcd.printf("%d cm\n", RangeInCentimeters); delay(16); Serial.print(RangeInCentimeters);//0~400cm Serial.println(" cm"); M5.update(); }
■ M5Stackでストップウォッチを作る
2019-12-28
■ 屋根裏実験室 M5Stackを使ってみる
■ 液晶付きマイコン「M5Stack」 と Google Home で、子どもとメッセージがやりとりできるシステムを作ってみた
https://fabcross.jp/category/make/20180425_kodomo_messenger_01.html