2020年9月22日火曜日

M5StickCバランスロボにBLE

 月刊I/O(2020年3月号、工学社)で紹介していただいたM5StickCのバランスロボ(リンク)を、BLEジョイスティックで操縦できるようにしました。

ジョイスティック送信機は、M5Stack社のJoyC+M5StickCです。右ジョイスティックに左右の回転、左ジョイスティックに前進後退を割り当てました。

 


 

動画です。


 


2021/5/16 ソースコードをアップロードしました。こちら。 

BLEジョイスティックのソースコードはこちら

 

 

2020年8月10日月曜日

micro:bitと電動消しゴムでバランスロボ

100円ロボット部のMAENOH!さんのアイデアで、ダイソーの100円電動消しゴムとmicro:bitでバランスロボを作りました。BLEと赤外線リモコンで操縦できるようにしてみました。
 


表側です。



 
裏側です。

BLEリモコンです。


ロボットは、基本的に両面テープと結束バンドのみを使って組み立ててあります。

ロボットに使用している部品は、
マイコン: micro:bit
モータードライバ: KS0308(TB6612)
ジャイロ: GY-521(MPU6050)
赤外線受光素子: GP1UXC41QS(互換品)
モーター・車輪:ダイソーの電動字消しx2
電池:16340(3.7Vリチウムイオン)x2
電池ホルダー:18650電池1本用
電源スイッチ
転倒時の衝撃吸収用パッドなど少々


BLEリモコンに使用している部品は、
マイコン:M5StickC
ジョイスティック:JoyC


ロボットの回路図です。


ソフトの開発には、Arduino IDEを使用しました。
PWM周波数の変更と、i2cのタイムアウトのためにライブラリを一部変更しています。





リモコン操縦をしているビデオです。

2020年5月25日月曜日

BalaCでライントレース

M5StackからBalaCという倒立振子のキットが発売されました。M5StickC、モータードライバが載った基板、ギヤモーター、ホイール、充電池がセットになっています。
これに反射型の赤外線センサーを取り付けて、ライントレースをしてみました。
ビデオへのリンクです。


上からの写真です。サーボのように見えるのはギヤモーターです。オレンジ色のモジュールがBalaCに同梱されているM5StickCで、基板を固定するためのねじ穴が2個追加されています。先端に付いている基板が追加した赤外線センサー部分です。


裏側です。i2cのインターフェイスとモータードライバがBalaCの基板に載っています。青い充電池があるので、モーターを回しても余裕です。M5StickCにUSBを接続すれば、この充電池に充電されるようです。


側面です。


赤外線センサー基板を含む先端部分です。適当なボールキャスターが無かったので、アルミのスピンナーを流用しています。

赤外線センサー基板の表側です。

赤外線センサー基板の裏側です。



回路図です。赤外線センサーはTCRT5000です。フォトトランジスタは、コレクタをLEDのアノードに接続し、約1.2Vで動作しています。M5StickCのVoutが5Vなので、このような回路にしています。




ソースコードの主要部分です(LCDの制御などを省いています)。モーター制御のi2cは正しい使い方かどうかわかりませんが、動いています。

#include <M5StickC.h>

void setup() {

  M5.begin();
  Wire.begin(0, 26); //SDA,SCL
}

void loop() {
  
  int16_t sLeft=analogRead(32);
  int16_t sRight=analogRead(33);
  int16_t diff=(sLeft-sRight)/35;
  drive (30+diff, 30-diff);
  delay(20);
}

void drive(int16_t spL, int16_t spR) {
  drvMotor(0, (int8_t)constrain(spL, -127, 127));
  drvMotor(1, (int8_t)constrain(-spR, -127, 127));
}

void drvMotor(byte ch, int8_t sp) {
  Wire.beginTransmission(0x38);
  Wire.write(ch);
  Wire.write(sp);
  Wire.endTransmission();
}

2020年2月4日火曜日

M5StickCでクォーツ時計を簡単駆動(分解不要)

Arduinoなどのマイコンで市販のアナログクォーツ時計を駆動する方法は数多く紹介されていますが、どれも時計を分解して、内部にあるステップモーターに配線する必要がありました。しかし、分解するときにプラスチックのツメが折れてしまったり、ギヤがばらばらになって組み立てができなくなってしまう場合がありました。

ここで紹介する方法では、時計を分解する必要がなく、時計の電池ホルダーから2本の電線でM5StickCと接続するだけで、時計の制御ができます。

全体像です。時計はダイソーで100円で売っているもので、文字盤の直径が11.5cmです。


配線は、時計の電池ボックスのマイナス端子をM5StickCのGND端子へ、プラス端子をM5StickCのG26へ接続します。



M5StickCで下記のスケッチを実行すると、時計の秒針が約1.5秒で2ステップ(2秒に相当)進みますので、約45秒で針が一周します。delay(50)の数値を大きくすると秒針はゆっくり動くようになります。

void setup() {
  pinMode(26, OUTPUT);
}

void loop() {
  dacWrite(26, 255*15/33);
  delay(1450);
  dacWrite(26, 0);
  delay(50);
}

このスケッチで動いている時計の動画です。



下記のスケッチは、秒針が約0.5秒で2ステップ進みます。ただしこの方式では、loop()内の最初のdelayの数値239はかなり微妙で、値を1増減しただけでも動かなくなったりしました。時計の置き方にも影響され、同じ時計でも個体間差がありそうです。

void setup() {
  pinMode(26, OUTPUT);
  for (int i=0; i<2; i++) {
    dacWrite(26, 255*15/33);
    delay(1450);
    dacWrite(26, 0);
    delay(50);
  }
}

void loop() {
  dacWrite(26, 255*15/33);
  delay(239);
  dacWrite(26, 0);
  delay(261);
}


このスケッチで動いている時計の動画です。



変わった針の動きの時計や、夏時間と冬時間の自動切換えなどに応用できると思います。