Arduino のブートローダを焼いて安価に互換機を増やそう

いろいろな作業を手軽に自動化する目的に Arduino は非常に便利です。

使え方を覚えてしまえば、わずか30分以内にデスクトップ筐体内の温度を自動検知してファンを回したり、人が近づいたときだけ照明を照らしたり、GPS信号から現在地を取得する電子機器を自作できます。

センシングデバイスとしても優秀で、温度、照度、色、臭気、角速度といった馴染みのあるものから、風速、液体、紫外線量、土壌湿度、ガンマ線といった専門的なものまで幅広く用意されています。

センサー1つあたりの価格は数十円から数千円ぐらいであり、安価に必要なデータを収集して、統計分析ソフトで処理しやすい形式で出力できる点に大きな魅力があります。

そして Arduino 自体もわずか 200 円から 300 円程度で互換機を複製できます。




Arduino の正体をきわめて大雑把に説明すると、1つの基盤の上にマイクロコントローラと入出力ポートを載せ、それを専用ソフトウェアと併せてパッケージ化したものです。

その本体と言うか、頭脳とも言えるマイクロコントローラも市販品であり、1つあたり 200 円から 350 円ぐらいで購入できます。

そこで、同種のマイクロコントローラを購入してきて、Arduino のソフトウェアを書き込むと互換機として動作させることができるようになります。


ATMEGA328P-PUコントローラ ATMEGA328マイクロコントローラ DIP-28

詳細な手順は公式のウェブサイト上で説明されています。


From Arduino to a Microcontroller on a Breadboard – Arduino
https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard


これを知っていると、書き込んだスケッチ(Arduinoプログラム)をマイクロコントローラ側に保持しておけるだけでなく、成果物を軽量化、省スペース化することにも役立ちます。

1つあたり 200 円ぐらいなので、用途が決まったらセンサと一緒に基盤に溶接してしまいましょう。


ユニバーサル基板 両面スルーホール ガラスエポキシ材 2.54mmピッチ

私はいつもセンサを購入するときに同数分のマイクロコントローラを一緒に購入しているので、無駄にたくさん持っています。

マイクロコントローラを購入してきたら、公式の解説どおりに回路を組んでブートローダを焼きます。

必要なのは 16MHz の水晶発振子20pF の積層セラミックコンデンサ、そして 10KΩ の抵抗です。

これらも1つあたり 10 円から 30 円ぐらいしか費用が掛かりません。

必要な部品を用意できましたら、実際に部品を接続します。

マイクロコントローラのピンには番号がついており、正しいピンに接続していないと書き込みに失敗しますので気をつけてください。

画像だとわかりにくいですが水晶発振子は D21 と D22 に接続して、それぞれ PB6 と PB7 のピンに繋がっています。

無事に接続できましたら、公式からハードウェア設定ファイルをダウンロードしてきて、指示通りに実行・・・する予定だったのですが、もっと良さそうなものがあったので、そちらを利用します。


GitHub – MCUdude/MiniCore: Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB
https://github.com/MCUdude/MiniCore


$ cd /usr/local/share/arduino/hardware/
$ unzip ~/Downloads/breadboard-1-6-x.zip -d .
$ ./tools/avr/bin/avrdude -v

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

$ git clone https://github.com/MCUdude/MiniCore ~/arduino/lib
$ ./tools/avr/bin/avrdude -v -v -v -v -P/dev/ttyACM0 -carduino -b19200 -C /home/buran/arduino/lib/packages/MiniCore-master/avr/avrdude.conf -patmega328 -e -Ulock:w:0x3f:m -Uefuse:w:0xfe:m -Uhfuse:w:0xd6:m -Ulfuse:w:0xe2:m

焼き終わりましたら基盤からマイクロコントローラを引き抜いて、新しく焼いたばかりのコントローラに差し替えます。

私はマイナスドライバで強引に引き抜いていますけれども、ピン先が非常に曲がりやすいので エンジニア 基板コネクタ抜き SS-10 のような専用工具を使用したほうがいいです。

ピン先を何度も曲げていると金属疲労で簡単に破断します。

私の場合は基盤に溶接することを前提にしていること、壊れる前から新しいものを調達してくることから気にしていませんが、再利用などを考えると本当は良くないことには違いがありません。

差し替えてデモ用のスケッチを書き込めれば、ブートローダの書き込みは成功です。

あとはこれに必要なスケッチを保存して、水晶振動子などと一緒に回路につなげば、Arduino ボードを使用しなくても Arduino のスケッチを動かせるようになります。

茨城県のサイクルツーリズムに対する自転車乗りの意見

関東の平野部において抜群に道路環境がよく、東京からも日帰りで遊びに行ける茨城県。

山間部が雪に閉ざされる厳冬期でも降雪とは無縁の気候から、一年を通して自転車を楽しめる関東以北では数少ない場所の一つでもあります(ただし朝方の冷え込みと季節風は強烈です)。

この点が認識されているのか、茨城県内では行政と民間企業が一体となって自転車を用いた観光創生の取り組みが活発に行われています。

筑波山や道の駅にはサイクルラックが常設され、霞ヶ浦の外周道路をはじめとした自転車道の整備が進み、土浦駅構内には輪行用の部屋まで確保されています。

こうした取り組みの概要は茨城県が公開する公的資料からも読み取れます。


いばらきサイクルツーリズム構想の策定について/茨城県
https://www.pref.ibaraki.jp/kikaku/chikei/keikaku/cycling/tourismkousou.html


目を通してみると、全体として悪くはないのですが、もったいないなと思える点もいくつかないわけではありません。

資料の焦点は人を呼び込むことにあるようですが、今でも多くのサイクリストが茨城県を訪れていることを認識されているのかどうかは資料からは読み取れません。

どこにいるのかと言えば、大洗から北海道の苫小牧へと向かうフェリー乗り場に行けば分かります。

現状でも首都圏のサイクリストにとって、茨城県は北海道への玄関口であり、また北海道ツーリングは本州縦断(東京-直江津間)やキャノンボール(東京-大阪間)に並ぶサイクリストの憧れです。

その北海道ツーリングのスタート地点として、たとえば土浦駅(もしくは高浜駅)から大洗港まで自転車で快適に走れるルートがあれば、それだけで茨城県の魅力が十分に伝わります。

幸いにしてフェリーの出航は夜で、到着は昼なので、大洗から北海道ツーリングに出かけるサイクリストにも出航前や到着後の時間を使って、茨城県を知ってもらうことを考えても良いのではないかと思うわけです。

そのための場所として、大洗・ひたち海浜シーサイドルート(仮)は最適だと思います。

魅力があることが分かれば、自然と人は集まります。

私自身が何度も訪れていて、茨城県は自転車で観光するには結構いいところだと感じています。

また、日本国内最高峰の自転車ロードレースとして名高い Japan Cup Cycle Road Race(ジャパンカップ)も、ツール・ド・フランスさいたまクリテリウムも、日本最大のスポーツバイクイベントであるサイクルモードも、茨城県の視点で見ると全ての会場が隣接県(土浦からの直線距離 60-80 km 圏)にあります。

とくにジャパンカップの会場である宇都宮市の森林公園周回コースに至っては、つくば霞ヶ浦りんりんロードの岩瀬駅から僅か 50km の近距離です。

茨城空港を起点としても最短 90km 程度と、スポーツ自転車であれば無理なく走行できる距離です。




さらに言えば、栃木県内の真岡(りんりんロードの岩瀬の隣町)から宇都宮までの 25km 間には既に自転車道(二宮宇都宮自転車道・鬼怒川CR)が整備されています。

協力して地域創生を行えれば、茨城県にとっても、栃木県にとっても、訪問者にとっても魅力的な試みになる可能性があるのではないでしょうか。

せっかく自転車道で土浦駅や茨城空港を結ぶ計画なのであれば、サイクリストに茨城空港や土浦駅を売り込めるように周辺の魅力にも目を向けても良いと思います。

土浦駅に到着して、自転車道に入ったところで宇都宮や大洗や苫小牧までの距離が表示されていたら、それだけでも旅情を感じます。

茨城空港に到着して、輪行の荷物を全部空港に預けて、そこからサイクルモードやジャパンカップの会場にサイクリングロード経由で行けるとなれば、茨城空港を使ってみようと思う人もいるかもしれません。

その道中で茨城県の魅力に気づいてもらい、次回の訪問からは茨城県自体も目的地の一つに含めてもらう。

その視点で見ると、隣県に恵まれている茨城県なら、いくらでも人を呼び込める可能性があります。

ぜひ、サイクルツーリズムで地域創生を成功させてもらいたいです。

センサーの値を信用できないとき

Texas Instruments LM35DZは手軽に使えるアナログ温度センサです。

Arduino で使用する場合には抵抗を気にせずに回路に組み込めるので、PCケースの内部温度を計測して自動的に冷却ファンを回したり、サーバ室やビニルハウスの温度を遠隔通知したりするときなどに便利に使えます。

使いどころは無限にあり、価格も安いので、いくつ持っていても困りません。中国某所でもモジュール単位で投げ売りされていたので、お土産に一つ購入してみました。

ここまでは良かったのですが、これを接続してみるとおかしな数値が出力されます。

なにこれ、絶対にありえないだろという数値ですね。

この温度だと錫や鉛の融点を超えてますので、はんだ付けされた部分が無事ではすみません。

そもそも計測範囲外です(詳細は以下のデータシートを参照して下さい)。


LM35DZ Datasheet (PDF) – Texas Instruments
https://www.alldatasheet.com/datasheet-pdf/pdf/520582/TI1/LM35DZ.html





計測結果に話をもどしまして、となりの列にある Sensor2 の出力は、同じ回路に組み込まれた同種のセンサのものです。

こちらは秋葉原で購入しました。

こいつらを2つ一緒に並べて同じ条件下で計測を行った結果が先ほどの出力になります。

より具体的には1秒間に1度の頻度で計測した温度をシリアル通信で出力することを行っています。

const float vcc = 5.0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  int sensorValue0 = analogRead(A0);
  int sensorValue1 = analogRead(A1);
  Serial.println(String(getTemp(sensorValue0)) + "\t" + String(getTemp(sensorValue1)));
  delay(1000);
}

float getTemp(int sensorValue) {
  return sensorValue * vcc / 1023.0 * 100;
}

このスケッチを 30 分間動かして、得られた結果をファイルに書き出しています。

これでどうして、摂氏 454 度みたいなおかしな数値が出てくるのでしょう。その答えは計測中にジャンパワイヤを引っこ抜いたときに判明しました。

センサの信号がただしく伝送されていないときに、マイコンは先の異常値と似たような値を出力することを実験して確認しました。となると怪しいのは基盤か溶接部分です。

そこで、センサが生きていることを祈りながら、モジュールからセンサを分離します。

最初は はんだ吸取り線 を使って丁寧に溶接を剥がしていたのですが、途中から時間が惜しくなってきたので、ニッパーでぶった切る方針に変更しました。

ピンがだいぶ短くなりましたけれども、無事にモジュールからセンサを取り外すことができました。

これを先ほどとおなじ回路に接続し直して再度の計測を行います。

一般的にセンサは過電流では容易に壊れます。

その一方で物理的や衝撃や熱に対してはそこそこ丈夫なものが多いので、まだ使えるような気がするという目論見のもと計測再開です。

※もちろん、プラスとマイナスの向きを間違えると異常発熱して危険なので、そこは気をつけてください。

その結果は以下のとおりです。

出力を見れば一目瞭然ですが、ようやく常識的な数値が計測できました。目論見通り、センサは生きていたわけです。

しかし、同じセンサを使って同一条件で計測しているはずなのに、結構、微妙な誤差がありますね。

厳密な調査で用いるならば、プログラムの方で調整してあげる必要がありそうです。この辺り、まだ探求の余地がありますね。

ちなみにグラフは以下のようにして、直接 PNG 形式で書き出すことができます。覚えておくと便利です。

$ gnuplot -V
gnuplot 5.2 patchlevel 2
$ gnuplot
gnuplot> set datafile separator ","
gnuplot> set grid
gnuplot> set ytics
gnuplot> set xtics
gnuplot> set xdata time
gnuplot> set timefmt "%b %d %Y %H:%M:%S"
gnuplot> set xrange ["Sep 15 2019 14:01:30":"Sep 15 2019 14:21:30"]
gnuplot> set format x "%M:%S"
gnuplot> set xlabel "Time (Min)"
gnuplot> set ylabel "Temperature (°C)"
gnuplot> set terminal png
gnuplot> set output "output.png"
gnuplot> plot "output.txt" using 1:2 title "Sensor 1" w lines, "output.txt" using 1:3 title "Sensor 2" with lines