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画面の構成など写真とは一部異なります。かなり強引なコーディングなので、より良い書き方がありましたら、教えていただけるとありがたいです。


2019年4月18日木曜日

Auto tuner for anniversary clock

An anniversary clock is a mechanical clock which has a time keeping mechanism called torsion pendulum, where  a horizontally rotating pendulum is suspended by a thin wire called torsion spring.  Anniversary clocks run much longer (up to one year before winding is required) than ordinary pendulum clocks because the rotating speed is very slow.  The name "anniversary" came from  the fact that winding is required once every year.  Anniversary clocks are less accurate than ordinary pendulum clocks.


The method of tuning torsion pendulum vibrating frequency is similar to the method for tuning ordinary pendulum (see this page).  Instead of applying vertical force to the pendulum, the tuning device applies horizontal force to imitate changing the elasticity of the torsion spring.  When the magnetic force pushes back the pendulum, that is equivalent to strengthening the torsion spring which shortens the pendulum period.  Below is the overall photo.


Here is the back of the base plate where you can see a coil to generate magnetic flux and a magnetic sensor (digital compass, HMC5883) to detect pendulum position.


Here is the magnet attached to the pendulum (flat silver square below white ball).


The external tuning device comprises ESP32 with OLED display (WEMOS LOLIN32 OLED), H bridge driver (L9110).


The display shows the time from internet and the clock accuracy, along with graphs of accuracy and coil current alternating every 5 seconds.  In contrast with the tuning device last year whose resolution was 1 second, this device calculates the accuracy to the resolution of 0.01 seconds.  The photo below shows accuracy of -0.04 seconds and relative current of 113.  The graph is showing the last 5 hours of accuracy trend.


Here is the accuracy (blue, left scale in second) and coil current (red, right scale in relative quantity -1023 to 1023) for 24 hours.  You can see the accuracy is within one second.


Here is the same graph with about one month of data.  During this period, clock location was changed, sensor position was changed, main spring was winded up, etc.  Because of these activities, you see the big jump in accuracy and output, but the accuracy came back to within 1 second.


Here is the schematic diagram.


Source code is here.


2018年7月28日土曜日

棒テンプ時計の精度アップ Ver3

メーカーフェア東京2018に出展しました。ご来場の皆様ありがとうございました。


Ver2(リンクはこちら)では糸の長さ調整をリニアサーボで行っていましたが、動作音が大きいのと、故障しやすいことから、ステップモーターに変更しました。

写真です。ステップモーターのねじのストロークは約17mmです。



ステップモーターのドライバーとしては、TIのDRV8834を載せたPololuのボードを使用しました。電流制限があまり小電流にならないので、ENABLE端子をSTEP端子と接続して、パルスの無いときは電流を流さないようにしています。
回路図です。



3日ほど連続で動かして、誤差は+/-10秒に入っています。下の写真が直近8時間のデータで、青い線が誤差(左目盛り、単位秒)、赤い線が制御出力の相対値のグラフです。