2020年9月22日火曜日

M5StickCバランスロボにBLE

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

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

 


 

 

 

 

 

 

動画です。


 

 

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);
}


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



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

2019年12月18日水曜日

GR-KURUMIと電動消しゴムでバランスロボ

MAENOH!さん考案の電動消しゴムロボットはメーカーフェアでも好評でしたので、ルネサスナイト15での発表用に、GR-KURUMIで作ってみました。


全体の写真です。ダイソーの電動消しゴムを使っています。電池は3.7VのLiPo。


CPU周りの写真です。GR-KURUMIの左にジャイロセンサー(MPU6050)、下にモータードライバ(DRV8835)、リセットボタンのすぐ下に赤外線の受信モジュールが見えます。KURUMIに載っているのは3.3Vのレギュレーターです。


回路図です。Arduino ProMiniと兼用の回路なので、3.7VがKURUMIのRAW端子に接続されていますが、JP8をOFFにしていますので、KURUMIおよび周辺への電源は3.3Vのレギュレータから供給されます。


ソースコードはこちら。テレビリモコン(ソニーフォーマット)による操縦ができます。ビット順が逆になっていて、データとアドレスをまとめて12bitで扱っているので、試す場合は、シリアルモニターでコードを表示させてみて、それをキーコードのセクションに記述してください。ジョイスティックによる操縦機能は除いてあります。

2019年8月11日日曜日

M5StickC バランスロボ


M5StickC には加速度計、ジャイロスコープ、電池、などが入っており、 モーターとドライバを追加するだけで、倒立振子を作ることができました。
 8月2日のM5Stackユーザーグループミーティングと8月3日4日のメーカーフェア東京で展示しました。

 全体像です。左から、M5StickC、モータードライバ、モーターです。
白い粘着テープは転倒したときの衝撃防止用です。


モータードライバは、共立エレショップのKP-DRV8830。
i2cのプルアップに4.7kΩの抵抗を使っています。
モーターも、共立エレショップのRM0TV0009AWZZ。
軸には、内径0.8mmの熱収縮チューブをかぶせています。
モーターや、基板の固定は両面テープで、かなりいい加減です。



裏側です。


MPU6886対応版はこちら。

2019年5月6日月曜日

ESP32で古時計の精度改善

これまではCPUとしてESP8266を使っていましたが、今回はその上位バージョンであるESP32とOLEDディスプレイが合体したボードを使って、機能と性能の向上を図りました。
モジュールの写真です。


時計と組み合わせた写真です。左が普通の振り子時計(以下重力振り子時計と呼びます)、右は回転振り子時計です。



動作原理を説明します。
振り子に取り付けられた磁石の磁力線を磁気センサーが検出して振り子のタイミングを認識し、時計のギヤ比を使って時計が指している時刻を算出します。一方正確な時刻は、WiFiを通してNTPサーバーから取得します。これらを比較して、時計が遅れている場合は振り子の周期が短くなるように、進んでいる場合は振り子の周期が長くなるように、調整します。

重力振り子の場合は、振り子に取り付けた磁石に対して、電磁コイルで上下方向の力を加えます。これは重力加速度が変化したのと同等の効果があるので、振り子の周期が変化します。下の写真の黒い楕円がコイル、振り子の下端についている円柱状のものが磁石、その直下にホールセンサーが黄色いワイヤーでコイルに固定されています。


回転振り子の場合は、振り子に取り付けた磁石に対して、電磁コイルで水平方向の力を加えます。これは振り子を吊っているワイヤの捻じりばね係数が変化したのと同等の効果があるので、回転振り子の周期が変化します。下の写真は回転振り子に取り付けた正方形の磁石。
下の写真は、ベースプレートの裏に取り付けた、コイルとデジタルコンパスです。



ディスプレイには、現在時刻、誤差、コイル電流に加え、誤差とコイル電流のグラフも表示されます。下は回転振り子時計の例です。2行目の-0000.04が0.04秒の遅れを示しており、113はコイル電流です(範囲は-1023から1023で、最大電流は100mA程度)。
グラフのX軸の範囲は約5時間、Y軸の誤差は+/-0.5秒の範囲を表示しています。


Webサーバーの機能も備えているので、WiFi経由でブラウザからアクセスできます。下の例はパラメータの設定画面です。


重力振り子時計の実験結果です。青が誤差で縦軸は左側、赤がコイル電流で縦軸は右側です。約1週間の測定でほぼ+/-0.1秒以内に収まっています。左の大きな変動は、時計を動かしたためのもの、右側の変動は周囲に置いたものによる影響と思われます。


重力振り子時計用の回路図です。
磁気センサーはデジタル出力のホール素子です。


回転振り子時計用の回路図です。
磁気センサーはi2c接続のデジタルコンパスです。

以下2020年5月17日追記

ソースコードはこちらです

ハードウェアをブログにアップしてから1年近くが経ってしまい、その間にソフトはだいぶ変更されたので、Web画面の構成など写真とは一部異なります。かなり強引なコーディングなので、より良い書き方がありましたら、教えていただけるとありがたいです。