WiFiWebServer4PiezoFont04でPUTするコマンドの書式の覚書き。

ESP8266の基板に圧電スピーカーとLEDを取り付けてWiFiWebServerとして起動してある。
これに特定のコマンドをPUTするとLEDが点滅したり圧電スピーカーが鳴ったりする。
スケッチがどれだったかすら怪しくなっていて、書式がどうだったかも完全に忘れている。

この記事を書いている時点で「WiFiWebServer4PiezoFont04_20200227_12」が該当するスケッチだと思うがちと怪しい。

にしても、書式に関しては以下のように決めてあったらしい。

//WiFiWebServer4PiezoFont04_20200227_10以降
//ピエゾとLEDの動作の決め方を以下のように変更
//Comment.LED Blink Number.Piezo Beep Number.Keep Check Button
//ドット区切りで半角英数のみスペースは無し
// Comment:先頭はコメント
// LED Blink Number:LEDをフラッシュさせる回数(0~9) 他が全部0のときのみ有効
//Piezo Beep Number:ピエゾ・スピーカーを鳴らす回数(0~9) 必ずLEDも同時にフラッシュする
//Keep Check Button:ボタンを押すまでLEDの点滅だけを続ける(0 or 1)
//エラー処理は一切なし

コメント.点滅回数.BEEP回数.点滅継続の有無
ということのようだ。




テレビの電源をON/OFFするだけの赤外線リモコン信号送信機をArduino Nanoで作る。

ソフト
 Arduino IDE 1.8.16(https://www.arduino.cc/en/software)
 IRremote 3.5.1(https://github.com/Arduino-IRremote/Arduino-IRremote)
ハード
 中華製Arduino Nano
 赤外線LED OSI5LA5113A(https://akizukidenshi.com/catalog/g/gI-12612/)
 赤外線リモコン受信モジュール PL-IRM2161-XD1
配線は以下の写真の通り。


実際にテレビのリモコンが送信している信号のデータを得る。
Examples>IRremote>ReceiveDumpを実行して以下の部分をコピーしておく。

以下のスケッチの該当部分にペーストする。
[crayon-6717464602390596968741/]
赤外線LEDをD3、赤外線受信モジュールをD2、タクトスイッチをD12に接続する設定になっている。
これだけで単機能な赤外線リモコンが完成する。
後は同様の手順でコードを増やし、それに応じてスイッチを増やしていけばリモコンの複製が完成する。




Arduino Nanoをsleepさせて消費電流を見てみた。(avr/sleep.h編)

いろんなライブラリが提供されているようだが、最初から備わっているのは
avr/sleep.h
のようだ。
スケッチの先頭に
[crayon-6717464602839787513606/]
を追加すれば使える。

Deep sleep in ArduinoからたどったA Guide to Putting Your Arduino to Sleepでもらったスケッチ
[crayon-671746460283f193730315/]

set_sleep_mode(SLEEP_MODE_PWR_DOWN);
の時の消費電流を測ってみた。
14~16mAのところが

3.5mA前後に減少する。

ちなみに、電源表示用のLEDのVFを2.1Vとすると、3kΩの電流制限抵抗がついているので1mA程度消費する。




モータードライバ TB6612FNGとArduino NanoでDCモーターを回す。

DRV8833の載ってるモジュールとTB6612FNGの載ってるモジュールを購入してある。
何しようとして買ったのか忘れた。
そもそもマイコン関連でDCモーターを使ってみたことあったかなって感じだ。
ステッピングモータやサーボモータは記憶にあるが。

試しに、これまた何しようとして買ったのかわからないDCモータをArduino Nanoで駆動してみる。


片方だけに1台だけつないでみるので下のような配線になる。

VM : 18650 for Motor
VCC : Nano 5V
GND : GND
AO1, 2 : Motor
STBY : Nano 5V
AIN1, 2 : Nano 7, 8
PWMA : Nano 9

AINのHigh, Lowの組み合わせで正転、逆転、停止、ブレーキをコントロールし、PWMで回転速度をコントロールする。




AndroidスマホでArduinoにスケッチを書き込む(ArduinoDroid)。

ArduinoDroidというAndroid用のアプリがある。

Androidスマートホンでスケッチの編集、コンパイル、Arduinoへの書き込みができる。


屋外に設置したものの設定をちょっと変更するとか、取り外して持ってきてPCにつないでという手間をなくしてくれる。
そういうシチュエーションでは非常に便利だと思う。




Arduino IDE(Ch55xduino)でCH552Gをプログラムする。

CH552GというUSB付きの安価な中華マイコンをArduino IDEで使う。
Arduino用のライブラリおよび導入方法は以下のサイトで。
https://github.com/DeqingSun/ch55xduino
上のサイトはモジュール化されたものについて書いてあるが、私はチップ単体を買った。
CH552GはAliExpressで送料込み10個$3.11だったので、1個35円。
変換基板が送料込み10枚$1.31だったので、1枚14円。
ピンヘッダはモジュールについてきた余り物が山ほどあるので無料。
これにコンデンサやプルアップ抵抗を追加してブレッドボード上で下の回路を組んだ。

回路図は上のサイトから拝借。

USBにつないでZadigから以下のように設定する。

下では名称をCH552Gに変更してあるが実際はUnknownとかになっている。
既存の別のものと間違えないように名称には注意する。

D+ピンをプルアップしたままUSBを接続し直すとPC上で以下のように認識される。

Arduinoでの準備は上のサイトの通りなので省略する。
下のような設定でBlinkのサンプルを書き込めばLチカが始まる。




Arduino Nano + HX711 + Nokia5110 LCD - 10kgロードセル用にキャリブレーション -

最初の記事は「ひずみゲージ用パーツ」だが、参考にしたスケッチについて書いてない。
次に登場したのは「Arduino Nano + HX711 + Nokia5110 LCD」だ。
1kgのセルを使い、スケッチはここからもらったものだと書いてある。
https://github.com/aguegu/ardulibs/tree/master/hx711

今回ケースを作ろうとして確認したら、いつの間にか10kgのセルが取り付けてあった。
試しに200mL入りの豆乳パックを乗せてみたら全然違う値を表示した。

さて、キャリブレーションってどうやったんだったかな。

Arduino IDEからExamplesを探したら、
Examples > HX711_ADC > Calibration
というスケッチがあったのでスケッチ上で接続ピンだけを変更して走らせたらキャリブレーション出来た。
以下に手順を書く。
1.HX711_ADCをもらってインストールしておく。
2.Examples > HX711_ADC > Calibration
 からスケッチを開く。
3.必要ならピンを変更する。

4.何か重さの分かるものを用意して重さを控えておく。
5.スケッチを起動する。
6.シリアルモニターに
 重さの分かるものをはかりに乗せてからその値を入力して送るように
 と表示される。

7.上は、153.5gの物をはかりに乗せて「153.5」をシリアルモニタから送信し、「243.12」という値が示されたところ。
8.hx711ではこの値を
 scale.set_scale(243.12);
 のように指定する。 

参考にしたスケッチが2つになってちょっと煩雑だったが、これで10kgのセル用のキャリブレーションができる。

Arduino Nano + HX711 + Nokia5110 LCD -ケース作成-




ATmega328PBの載ったArduino Nano互換ボード

最近知ったのだが、ATmega328Pの後継にATmega328PBというのがあるらしい。
これの載ったNano互換機を買ってみた。


確かにATmega328PBが載ってはいるが、

PとPBとでピンの働きの異なる3ピンと6ピンは、基板上で見た限りではどこにも配線されてないようだ。

つまり、ATmega328Pの載っているNanoと同じ扱いで何の問題も無いということ。
ちなみにチップそのものの価格はMicrochipの他のマイコンと同様に新しいPBの方が3割がた安い。
たただ1点、Old Bootloaderを指定しないと書き込めないのが煩雑だ。

Bootloaderを新しくするためにMiniCoreを導入する。
https://github.com/MCUdude/MiniCore
具体的には以下の手順
 Additional Board Manager URLs: に以下を追加する。
 https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
 Boards ManagerからMiniCoreをインストールする。
以下のようにしてBootloaderを書き換えた。
1.書き込みに使う方のNanoにArduinoISPというスケッチを書き込む。
 書き込みにはATmega328Pの載った普通のNano互換機を使った。
2.MiniCoreからATmega328を指定する。

3.以下のように設定してから Burn Bootloader をクリックする。

配線などに関しては以下を参照のこと。
Arduino NanoでArduino NanoにBootloaderを書き込む。
4.以下のようになる。




Arduino NanoでMHzオーダーの方形波を出力する。- CTC (Mode 2) -

Arduino NanoでMHzオーダーの方形波を出力する。- Fast PWM (Mode 7) –
の別モードのバージョン。

Clear Timer on Compare Match (CTC) Mode についてやってみる。
信号の変化を変数で制御できるモードということで眺めると、CTCというモードにもOCRAレジスタが関連していて良さそうだ。
読んでみるとこの方が仕組みが単純で、ただカウンターの値とOCRAの値とを比較するだけのようだ。

CTCモードにした場合は、出力はOC2A(D11)になるようで、下のように設定したら方形波が出た。



TCCR2B = bit (CS20);
はプリスケーラ無しで16MHzをカウントする設定。

上の例ではOCR2A=1となる。
カウントして1になるとOCR2Aに等しいのでカウンターをゼロにしてカウントを再開するとまたすぐ同じになって…。




Arduino NanoでMHzオーダーの方形波を出力する。- Fast PWM (Mode 7) -

Arduio Nano
Arduino IDE 1.8.12

サーボやLED用のPWMの作例が多いので、単純に数MHzの方形波を出すだけとかいうスケッチの例が逆に見当たらない。
PICならすぐに作れるのだが、Arduinoでやるのは難しい。
なぜかと言うと、一方にライブラリという便利なものがあって、だが一歩その範疇を外れるとAVRについて調べ直すという苦行が待っているからだ。
PICで一度通った道だから全く初めてというよりは楽だろうが、その場合、今度は「二度手間感」がまとわりつく。

どうしようかなあと眺めていたら、50kHzの方形波を出すスケッチ例が見つかった。
Timer2を使っているが、当然MsTimer2などのライブラリを使わず、ATmega328Pのレジスタを直接設定している。

早速書き込んで動かすとD3から50kHzの方形波が出た。

ATmega328Pのデータシートを眺めて設定を確認するのだが、とても煩雑なのでスケッチの規定値に沿ってそこだけ見ていく。
TCCR2AのWGM20,WGM21とTCCR2BのWGM22は波形モードを決めていて、ここではFast PWMのモード(Mode 7)になっている。

タイマーを0からカウント・アップして行ってOCRA(OCR2Aのこと?)の値と等しくなったらフラグを立てる、ということのようだ。
その前提でCOM2B1が設定されている場合は下のような動作をするらしい。

つまり、カウンターが一致したらOC2BをLowにする。
COM2B0,COM2B1ともに設定すればHigh,Lowが逆転した波形になる。
ちなみにOC2BというのはD3ピンに割り当てられているので、要はD3ピンに方形波が出力されるということだ。
なので、
const byte LED = 3;
pinMode (LED, OUTPUT);
が書いてあって出力の準備がしてあるわけだ。

続いてタイミングの取り方を見てみる。
Nanoの元のクロックは16MHzなので50kHzにするためには320回数える必要がある。
カウンタが8ビットなのでこれだと多すぎる。
クロックを8分周して数える数が40回で済むようにする。
CS21だけを1にすれば下のように分周比が8に設定できる。

あとは
OCR2A = ((F_CPU/8)/frequency) – 1;
で計算して
16000000 ÷ 8 ÷ 50000 = 40
がOCR2Aに代入される。
const long frequency = 50000L;
の値を大きくしていけば方形波の周期は短くなっていくわけだが、カウントする数である以上計算結果は正の整数でなければいけない。
このままでは2000000を超える値は指定できない。
その場合は、分周せずにクロックを直にカウントすればいいので、CS21のかわりにCS20を1にする。
4MHzの方形波を出力してみた。

ここまでスケッチ中のOCR2Bが一度も出て来てなかった。
Duty比50%だから半分の値でいいのか。

良く分からないままCTCも。
Arduino NanoでMHzオーダーの方形波を出力する。- CTC (Mode 2) –