はじめに:
パッチコです。子供の頃から極めたかった技術。それは電気工作。
小学校くらいからよく、いろんな電化製品をバラしてみたりしたものですが、実際のところどこからとっかかったらいいものかわからないものでありました。正直成績はあまり良くありませんでしたし、得意なところは電磁誘導とか、直列モーターの作成とか。覚えている公式なんて、オームの法則や右ねじの法則、フレミングの左手の法則くらい。いやいや、これだって、実際の生活では役に立っているのかどうなのかというところです。
実際に何かを作ろうとした時に、トリガーとなる起点が見つかりませんでした。今でこそインターネットなどもありますが、ただの部品ひとつから商品を作るのは非常に困難です。
今回EdisonとArduinoをレビューすることになりましたので、いいキッカケとして少しだけでも開発手法に触れていけたらと考えています。パッチコはパソコンやOSのいわゆるソフトウェアについてはある程度技術があるものの、電子工作の経験はほぼ皆無です。なるべく正しい技術をお伝えできればと思っていますが、誤りなどあるかもしれません。その際はお気軽にコメント等、ご指摘ください。
最終的なゴールは、筆者のような素人でもこの世界に入っていけるきっかけになれば最高です。
Edisonキットfor Arduinoってどんなもの?:
Intel EdisonはIoT デバイス向けのシングルボードコンピュータです。大きさは SDカードほどの大きさ。デュアルコアのIntel ATOM 500MHz、1GB のメモリを内蔵しています。
今回最初に届いたのはこの1箱。Nexus7くらいの大きさの箱1つ。
蓋を開けると、edisonチップが1つ。うわーって思いましたw
パッケージにはedisonチップ、Arduino開発ボードとネジ類。
それとFCC等の規約の書かれた紙1枚です。
edisonチップには、制御用のCPU,メモリ、ストレージ、wifi、bluetoothが入っています。本当に1チップに全てが内蔵されています。ただ、このサイズでは開発をするのに難しいので、IOを担うボードに接続します。これがArduinoボードです。
正直な話、ここでちょっとビビリが入りました。私に本当にできるのでしょうか?
とはいえ、このままでは始まりませんので、最低限の動作確認に入ります。
スタートアップから動作確認まで:
ここまででedison,Arduinoについて全く分かっていない状態ですので、まずはボードの組み立てとパソコンへの接続、動作確認までをedison-labサイトのgetting startedに従って実施していきます。
私はMACもWindowsも使えますので、とりあえず両方試した上でわかりやすいMACで進めることにしました。
http://edison-lab.jp/gettingstarted/edison-arduino/mac/
組み立てに関しては特に問題ありませんでしたので、割愛いたします。gettingstartedに詳しく書かれていますので、詳細は上記のリンクを参照してください。
組み立て上がりました。
次にPCとの接続です。
ArduinoにはUSBポートが3系統あり、うち2つのmicroUSBがパソコンとの通信及び電源の確保を行います。写真上のボード中央のポートが電源を給電します。USBポートのとなりのスイッチが給電の切り替えとなります。大量に電力を使用する場合、ACアダプターを使用したほうが安心ですが、筆者のような初心者については、とりあえず、microUSBを使ったほうが安心でしょう。
シリアルコンソールでOSにログインしてみる:
シリアルコンソールというのは、最近よく見ませんが、テキスト入力と出力でOSの操作を行う手法です。基本的にはテキスト文字しか送ることはできません。
MACの場合は、OS自体がBSD(Berkeley Software Distribution)の子孫であるため、OS標準の機能でシリアルコンソールを実行できます。Windows等ではPuTTYやTeratermを導入して使いますが、今回は簡単さを重視します。
MAC OS Xには標準でターミナルがあり、外部コマンドにて
screen というシリアルコンソールが付属します。
ターミナルの画面がでましたら、次のコマンドでシリアルコンソールを起動します。
プロンプトは変更しています。screenというプログラムを使います。
書式は screen [シリアルデバイス名] [通信速度] -L です。
デバイス名は/dev/cu.usbserial- まで入力し、[TAB]を押すと補完されます。一旦接続してしまえば、同じ名前のようですね。
実行すると空欄の画面になりますので[return]を2回押すとloginIDを聞いてきます。パスワードをふっていなければ、IDはroot、パスワードは無しです。
おお、Linuxですね。
無事にログインできたようです。この画面はMACではなくedison自体にログインしています。
シリアルコンソールを抜けるは、[ctrl]+[a]を押したあとに[k]です。ちゃんと抜けないとポートを掴みっぱなしになるので、edisonの電源を切るまでは再度シリアルコンソールに接続できなくなります。
Arduinoをインストールする:
ソフト面のプログラムを行うArduinoソフトウェアをサイトからダウンロードします。
https://www.arduino.cc/en/main/software
詳細はgettingstarted に記載されていますので、ここでは割愛します。
作業としては以下になります。
・ソフトウェアのダウンロード
・インストール
・Board Managerでの設定
Board Managerは使用する環境に合わせて必要なものを追加します。edison+Arduinoの場合は2つが最低必要になります。
Board Managerは「ツール」→「ボード」→「Board Manager」で開きます。
一番上の Arduino AVR Board by Arduino はデフォルトでインストール
されていますが、使用するボードによってはアップデートが必要です。
追加で設定する必要があるのはIntel i686 Boards by Intelです。これを追加しないとボード選択でedisonが選べません。
getting starting でここの表記が間違っていて、初め意味がわかりませんでした。
・ボードとポートの設定
ボード(Board)は「Intel Edison」を選択してください。
ポート(Port)は/dev/cu.usbmodem**** を選択すること。似たような名前のcu.usbserialを選択してしまうと、スケッチのアップロードの際に失敗します。
スケッチサンプルをアップロードして動作確認を行う:
一番簡単な動作確認として、スケッチサンプルに含まれる、「Blink」をedisonに転送して確認する方法があります。他のレビュアーさんも紹介しておりますが、ボード上にもっているLEDランプを点滅させるだけのスケッチプログラムです。
ここで少しはまりました。スケッチを転送する際にエラーになってしまうのです。
私の思い込みがあり、Arduinoソフトウェアもシリアルコンソール経由でアップロードを行うと思っていましたが、実際にはシリアルモデムのプロトコルで通信をしていることがわかりました。
この状況を踏まえ、Arduinoのソフトウェアの設定を改めたところ正常に動作しました。
簡単にBlinkスケッチの説明をすると
void setup() は初回1度だけ実行される部分を記載します。ここではデジタルポート13の動作モードを出力にセットしています。 デジタルポートはハイで出力すると5Vで出力します。
void loop() では{}内に記載されたプログラムをループ実行します。Blinkでは以下の動作を記載しています。
・デジタルポート13にHighを出力
・1000ms待つ
・デジタルポート13にLowを出力
・1000ms待つ
このデジタルポート13というところがミソで、13ポートはArduinoのオンボードLEDにも割り当てられていますので、回路を組まなくても動作します。
一見難しそうに見えますが、大したことはやっていません。
サンプルスケッチからの回路接続:
先の「Blink」ではArduinoボード上のLEDを使用しましたが、少し発展させて、外部回路のLEDを点滅させます。
スケッチサンプルの機能を試すためには幾つかの部品を調達しなければなりませんが、SWITCH SCIENCE社より初心者向けにパーツキットが発売されていますので、そちらを購入しました。
トライアンドエラーの繰り返しになりますので、半田付けをしないでも回路が組めるブレッドボードやLCDユニット、ジャンパーケーブル、LED、スイッチ等がキットになっています。これはとっかかりにはオススメです。
まずはサンプルスケッチ通りに回路を組みます。
サンプルスケッチでデジタルポートの13番を指定していますので、デジタルアウトの13番ポートからスイッチを獲っています。
一応、回路を接続する際には、後接続などもあり得るため、電源は落として操作してください。
半田付けが苦手という方もいるでしょう。今回は簡易的に回路を接続できるブレッドボードを使います。ブレッドボードは一般的に以下のような配線になっています。
外側は電源やアースで使うように横一線で結線され、
中央は部品を接続するために縦に結線されています。
私が前に挫折した時は全部半田付けしてたなあ。。そりゃ挫折しますよね。これは便利です。
配線を完了したところで、先程と同様にBlinkスケッチをアップロードします。ArduinoボードのLEDと同じタイミングでブレッドボード上のLEDが点滅しています。
せっかくなのでデジタル12ピンを使って、回路をもう一組同じ構成を追加し、プログラムに一手間加えました。
「Blink」サンプルに若干手を加えたものです。
Blinkのサンプルではポート13を使いましたが、さらにポート12も使うように書き換えました。
loop()では書かれているプログラムをループします。このサンプルの書き方では0.5秒ずつ待ち時間を設けているので、交互に点滅する動きになります。
ここまでやってedisonとArduinoがどういうものかわかってきました。
edisonは実際には組み込み式のLinuxとして動作します。電源を取得するとLinuxベースのOSが起動し、スケッチという制御用のプログラムをロードするとバスに対する動作を実行できます。
Linuxという言葉を聞いて、拒絶反応が出る方もいるかもしれませんが、Dosの原型となっている、対話式のOSと思っていただければ良いかと思います。これなら筆者の持っている知識が役に立ちそうです。UNIXって日本の一般PCユーザーには馴染みがないかもしれませんが、MACOSXだってUNIXなんですよ。
スケッチサンプルについて:
サンプル2つ目。LCDパネルを組んでみます。(LiquidCrystal->Hello World)
トライアルキット by edison(SWITCHSCIENCE社)のキットに含まれるLCDキットを組んでみます。困ったことに、edisonの本家のサンプルでは使用しているLCDの装置が異なるので、配線が異なります。配線図はトライアルキットのものを使用しますが、印刷物の精度が低く、ホームページを参考にしたほうがいいかもしれません。
1つ目のサンプルの時よりも格段に結線数が多いのと、Arduinoのポートをかなり占有してしまうため、ちょっとうまくないのですが、まずはサンプルで挑戦です。
配線はビビらず焦らず、しっかりチェックしたほうがいいでしょう。
配線はこんな感じ
このキットに含まれるLCDパネルは、バックライトと液晶の使用電力が異なる(液晶が5V、バックライトが3.5V)ので、1つだけ抵抗が入っています。この抵抗を間違えるとバックライトが壊れるそうな。
トリマポテンションメータが付いているのは液晶の輝度を調整しています。はじめ文字が映らないと思ったら、輝度の設定で見えるようになったオチもあります。
サンプルスケッチは以下。
実はサンプルスケッチのままですと、液晶の初期化がうまくいかないので、
下記の赤字の部分を追記しています。
void setup() {
lcd.init(1, 12, 255, 11, 5, 4, 3, 2, 0, 0, 0, 0);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
lcd. というクラス(C++でいうところの)は#include <LiquidCrystal.h>で定義されていますが、引数の意味を確認しておかないと下手にいじるのは危ないです。まずは「おまじない」ということにしておきましょう。
1度このLCDを組んだ時に動作しなくて焦ったのは、おそらく先に別のサンプルスケッチを試したせいで、初期化がうまくいかなかったものと思われます。配線は何度もチェックしましたしね。
サンプルにも結構抜けがあるのもご愛嬌。だってオープンソースですもの。暖かくフォローしてあげるといいですね。みんなで作るのがオープンソースですよ。
何をつくろう?:
実は事前に何を作るかは申請しているのですが、他のレビュアーさんのレビューを見ていると、基本的にセンサーから入力をして処理を行う方法が多い気がしました。私の場合は何ができるだろうと考え、せっかくLinuxOSを内包しているのだから、OSを生かした使い方を進めたいと考えました。
そこで、OS機能のクロックなどをうまく生かして、目覚まし時計を作りたいと思います。
ただの目覚ましではつまらないので、絶対に起きれる目覚ましを作りたいと思いました。もっといろいろ考えていたのですが、とっかかりにはいいのではないかと思っています。
絶対に起きれる目覚まし時計の考察:
目覚まし時計というのは一般的にアラームを鳴らすものがほとんど。
音や振動で目覚める装置はSmartWatchで十分こなせます。パッチコも今まではこの方法でした。その他の方法について調べてみたところ、意外に少ないですね。
1、空気圧により上体を起こすシステム。
JRの当直運転士の目覚めを促すため開発されたと言われているシステムですが、市場を探してみたが、本家の製品は約10万円もする非常に高価な機械でした。
今回試作機では、圧入ポンプ付きのマットレスを購入してみたが、どうもポンプの性能が不足しており、人が寝ている状況では空気を圧入することができないようです。
また、非常に爆音のため、それ自身の音で起きるというのもありますが、、
2、LEDライトを顔に照射
人の睡眠で覚醒を促す方法として、日差しもしくはブルーライトを当てる方法が良いとのこと。
https://ja.wikipedia.org/wiki/%E7%9D%A1%E7%9C%A0
今回は実験的要素も含めLEDのスタンドを購入してみた。
購入してみて、ちょっと困ったのがタッチ式の電源スイッチが付いているため、電源連動だけではスイッチがつかない、、
小改造をしないといけないですね。ELECOMさんごめんなさい。
電気工作の経験が少ない私には不安がいっぱいなので、ちょっと別のものを試してみます。
代わりにもっと動作させやすいものがありましたのでこちらを採用します。
3、物理的な刺激によるもの
一般的なアラーム音も刺激の一つではあるが、今回はあえて物理的な攻撃をする装置を用意する。
筆者の稚拙な発想で思いついたのはハリセン。本当に稚拙ではあるが、実験的要素と失笑を受ける絶好の機会として、これを提唱する。
当初検討していた装置は、プーリーとカムを使用したものを検討していたが、設計どおりのプーリーを入手することが困難であったため、取り急ぎ簡易的な構造での試作とする。時間的なゆとりがあれば再度設計し直したいところ。
ドリルにハリセンをつけただけだと危険であるため、
いざ実装:
正しい時刻の取得:
時計機能については、WifiによりTimeServerより取得できます。
ただしバッテリーがないので、起動時にはWifiに自動接続を行い、正確な時刻を取得する必要があることと、電源を維持する必要がある。
Edison+Arduino環境では組み込みLinuxOSがあるため、これらを自動的に設定しておく必要があります。
事前にWIFIに接続すると自動的にGoogleのタイムサーバから時計を合わせつことがわかりましたので、今回はスケッチサンプルのWIFIサーバを試して時計が会うことを確認しました。
実行はシリアルコンソールから実行します。
時計の情報は当初タイムゾーンが日本になっていないので、時間があっていません。
一度も設定していなければ、もっとメチャメチャな時刻になっています。
・Edisonのタイムゾーンを日本にする # timedatectl set-timezone Asia/Tokyo
・edisonのWIFIを設定する。参考までにiPhone6+でやってみます。
# configure-edison -w
iPhone6のテザリングでは不可視になっている場合があるので、手動でSSIDを入れています。
WIFIが確立されると、GoogleのタイムサーバからNTP(Network Time Protocol)で正しい時刻が取得できるので、時計合わせは不要です。タイムゾーンがあっていることと、ネットワークが使えることがポイントです。
設定が完了したら、edisonが起動した際に自動的にWIFIを繋ぐようにします。
・edisonの起動時にWIFIを有効にする。
# systemctl enable wpa_supplicant
目覚ましの実行を行うイベントはどう処理するか:
目覚ましはまず基本の時刻があり、予定の時間になったらイベントを実行させます。
今回の実装にあたって、システムエンジニア的な発想で、OSの機能を使って実装すれば、あとは実行させる目覚まし機能に特化して制作ができると考えました。
幸い、Linuxを採用しているので、時間指定実行は十八番といってもいいかもしれません。
従来までのLinuxはcrontabという、時間指定実行の仕組みがあり、本件の応募時にはそれを使えばいいと思っていました。
実際にedisonを使ってみたところ、cronは導入されておらず、次世代のシステム管理ツール「systemd」を使用しろとのこと。もちろん、cronを追加して実行することもできますが、今回はできるだけedisonの持っている機能を使っていくことにしました。
参考:
https://wiki.archlinuxjp.org/index.php/Systemd/%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC
スケッチ(edisonのプログラム)はLinuxのプロセスの一部として自動実行されています。
実行状況の確認:
# ps | grep sketch 177 root 28024 S /sketch/sketch.elf /dev/pts/0
このsketch.elf をリネームしておくとedison起動時にスケッチが実行されなくなります。
逆に/sketch/sketch.elf /dev/pts/0 と実行するとスケッチをその時点から実行できます。
この状態を使って、systemdで決められた時間にスケッチを実行します。
リレーによる各装置の起動:
目覚まし装置の稼働のため、異なる複数の機器を動作させるため、今回は電磁リレーユニットを接続し、電力の種類にとらわれず稼働する装置をedisonに接続する。
電子工作をやったことのない人のために、まずはリレー装置について簡単に説明しておきます。
電磁リレーユニットの例
https://ja.wikipedia.org/wiki/%E7%B6%99%E9%9B%BB%E5%99%A8
今回使用するのは電磁継電器というもの。Edisonの出力できる、デジタル信号はオンの時5Vの電圧がかかります。オフは0V。これらの電力はLED程度であれば問題ありません。(全体の容量が限定されています。)
では仮に100Vの電源をオンオフさせるにはどうするか。
制御用の回路に電磁石を用いて100V側の回路をオンにしてあげれば、Edison側の出力に関係なく電源の制御ができます。これが電磁リレーです。
リレー装置をいくつか物色したところ、一般的なリレー装置を購入するよりも、基盤化されたリレー基盤を購入できたので、そちらを使用することにする。
サインスマート(SainSmart) 2チャンネル 5V リレーモジュール for Arduino DSP AVR PIC
サインスマートの製品のリレーユニットボードです。
スイッチング時にスパークなどを抑えるため、クローズドの電磁リレーを採用していますが、結構な動作音があります。この辺もコストをかけてソリッドステートタイプ(半導体方式)を採用すれば、改善は可能ですが、今回はあくまでも試作。動作音がしたほうが動作もわかるし面白いので、このタイプで我慢します。
LCD装置の不具合か故障のため、デジタルアウトにリレー装置と同居することが困難なため、今回はあえてLCDの接続を見送りました。
事象として、スケッチサンプルのLCD Hello Worldのサンプルを稼働させた状態で、デジタルアウトポート13を当リレーに割り当てたところ、リレーが誤動作する事態が発生したため。
おろらくLiquidcrystal.hで定義されているポート以外にも信号が発生しているものと思われます。
ハリセンマシンを作ってみる:
ハリセンを選んだことを少々後悔した部分があります。
思っていたよりも奥が深いんですよ。ハリセンは打つ時のスピードと、インパクトの瞬間に引く。この機構をどう再現するかを考えていくうちに、レビュー期間が削られていく。いざ製作しようとしたところ、部品が手に入らない。特にベルトドライブやプーリーがダメですね。
あと思いの外、強力な動力が必要です。
とりあえず、形にしないといけないので、かなり雑で危険な方法ですが、暫定案として電動ドリルを動力に用います。
工作用紙。なん年ぶりに購入しただろう。
ハリセンの作り方は結構コツがあります。やんわり折って持ち手を絞る感じに。
ハリセンを選んで良かったことは、今回動力に採用した電動ドリルが今度は強すぎるキライがあるので、その衝撃を緩和できること。つまり衝撃を緩和できることです。
あくまで試作としてこの方法を取っていますので、実際に目覚ましにはハードですよね。
ドリルにハリセンを固定し動作させる:
とりあえず、布テープで固定。ハリセンの動きに遊びができるのが不幸中の幸い。
結構な振動があり、しっかり固定する必要がありますね。重りも必要です。
このままでは怪我をすると思い、縦運動の装置に路線変更です。
縦運動の装置を作るのは結構癖があります。特に打撃系の装置なので、やんわりでは意味がありません。以下のような装置を製作することにしました。
雑ですがこんな感じで。
思った以上に木工は大変でした。工具もないし、、
設計のイメージとして鹿威しですが、雑ですみません。
カムの駆動については当初プーリーを考えていたのですが、入手困難のため、
調べに調べた結果、タミヤの低回転ギアボックスを採用。便利なキットがあるものです。
ギアは4組の組み合わせが可能ですが、一番遅いギアの組み合わせを採用。
ドライブシャフトにかなり大きめなカムを作成し取り付けるので、干渉しない組み合わせで組み立てました。ギアボックスの面白いところは、低速に設定することでトルクがアップできます。
今回ははたき落とす力を加えるため、輪ゴムを使ってテンションをかけますので、威力を上げようとすると結構なトルクが必要です。ハリセンの振り幅を増やすため、カムも大きめに設定しないといけません。
カムの製作:
加工性も考慮に入れて、1mmのプラ板で同じカムを2つ製作。2枚を貼り合わせて1つにしました。厚みがないとカム自身が曲がってしまうため。場合によっては3つを貼り合わせます。
まずは型紙を作ります。
型紙で、カットラインをプラ板に写します。
予備を踏まえて4枚。
加工に時間を取られたくなかったので、思い切ってハサミでカット。うまくいきました。
プラ版の厚みは1mmがハサミの限界かな
曲線はハサミがベストです。
今回は3枚作成して、貼り合わせたものをドライブユニットに固定。
こんな感じに仕上がりました。結構大物です。
振り上げ最大(上死点?)
カムを受けるリベットは既製品では難しかったので、マーカーとボルトナットの組み合わせです。モーターの電圧は当初3Vを予定していましたが、思った以上にスピードが速かったため、1.5Vで組んでいます。
ハリセンをセット。とりあえずガムテで。取り付け部はもう少し考えたほうがいいかな。
次にリレーユニットを接続
すべての配線が終わったら、スケッチを作成します。
今回は本当にシンプルなので、Blinkのサンプルとほぼ同内容で作成です。
スケッチが動作したら、リネームしておきます。
# mv /sketch/sketch.elf /sketch/sketch.org
Systemdに実行するタスクとシェルを登録します。
・実行するコマンドは以下。拡張子はorgでも実行権限があれば行けます。
# /sketch/sketch.org /dev/pts/0
動作しました。
反省点:
電子工作の入り口には到達したと思いますが、終盤ではどちらかというと機械工作になってしまいました。。
木工加工が多かったのですが、あまりにも久しぶりで工具とかほとんど持っていなくて少し後悔しましたね。プラ版を加工するのも手だったのですが。
この目覚ましユニットは、実用になるかは全くわかりませんが、なぜ世の中にない方式なのか少しわかった気がしますw
今後改善したい箇所は、カムのトルクが足りていないので、電圧を上げつつ、ギア比をもっと低速にしていく必要がありそうです。
まぁ、試作機ですからね。問題があって当然です。
まとめ:
edison+Arduinoという環境があって、なんとかここまで行き着きました。目的のために組み合わせなどを工夫することで比較的簡単に試作機などを作成できます。
背景にはソフトの知識などがあれば、ソフトの製作もかんたんになります。
今回はあえて、スケッチだけに頼らない方法を目指しましたが、スケッチだけで完結することもできます。
想定したレビューにはまだまだ届いていないので、この後もしばらく追記の予定です。
cybercatさん
2015/09/26
パッチコさん
2015/09/26
そう。私もちんぷんかんぷんですw
電気工作はちっちゃなものをたくさん作って行くことで自信や経験値が増えていくので
これはいい経験になりそうです。
絶対起きれる目覚ましは多少の笑いを狙っていきますw
jakeさん
2015/09/26
時間になるとポンプが動いて、布団が持ち上がるのでイヤでも目が覚めるとか。
パッチコさん
2015/09/26
それも候補にありますねーw
あれは結構簡単ですが、実はポンプの音をどれだけ小さくできるかがポイントかもですw
ちばとどさん
2015/09/26
Edisonは、Arduinoのスケッチ以外にも他に動かす手段は選べるので何度もおいしいかもです。わたしは、node.js にしようかなっと。
パッチコさん
2015/09/26
皆さんの助言を得てなんとかなりそうな気がしてきました。
java関連でいくと色々できますね。
私はC++のほうがなんとかなりそう。
楽しくなってきました。
jakeさん
2015/11/04
supatinさん
2015/11/05
(*・ω・)*_ _)ペコリ
難易度の高いレビューお疲れ様でした
普通(?)の初心者向け電子工作キットよりも
敷居も難易度も高いけどその分面白そうですね
(*´ω`*)
パッチコさん
2015/11/05
うっは、、直しておきます。。
疲れてますねえ。。
パッチコさん
2015/11/05
実際に作り出すと結構大変でした、、
木工道具とかその他の工具もかなりなくって買い足しましたね。
プラ板て硬いんだなあって。