2014年7月26日土曜日

Raspberry PiのGPIOソケット直結のArduinoを自作してみた

Raspberry Piから、「Arduinoのプログラムと同じように書いて、Arduinoのシールドをそのまま使えるようにする拡張カード」は結構出ているようだ。重要なのは、Arduino用のシールドとして販売されている基板をRaspberry Piから利用するということで、Arduinoそのものが途中にいるわけではない。
商品として、せっかくのRaspberry Piの機能を犠牲にして間にArduinoをはさむような間抜けなものは出したくない、というのは当然だと思うし、使いたいのはシールドになっているセンサーその他のデバイスであってATmegaマイコンではない、のが普通だと思う。

というわけで、その「普通ではないほう」をやりました。といっても、Arduino IDEからプログラムするほうはまだできていないので、中間報告というか、ざっくり「ドリトルの教科書に書かれている、『Arduinoの利用』」がそのまま使えるようにしました、ということであります。

ドリトルはArduinoとはシリアル通信するので、Raspberry PiのGPIOにせっかく出ているいろいろな端子は全く使わず、電源とシリアルのみを使うという豪勢なんだか貧乏なんだかわからないソリューション。

回路は、Arduino Unoから電源関係とUSB関係を取り除いた、ATmega328P周辺と、レベルコンバータがわりの分圧抵抗だけという簡単構成。というか、手ハンダで受講生人数分を揃えるのに余計な作業は避けなければならないという事情。

基板は、いわゆるバニラシールド基板でよいわけだけれども、試しに秋月が扱っている長方形のユニバーサル基板(200円)を使ってみることにした。というのは、秋月オリジナルのバニラシールドは、USB B端子などにあたる部分はスルーホールにせず、SMD用パターンにして「うっかりミス」に配慮されているのだけれど、僕はArduinoそのものを作るので、基板全体を使いたいということ、特に、今年は多分間に合わないけれど、モータドライバICを載せるスペースを確保しておきたいという希望があったから。ただし、その長い部分はV字カットが基板に入っており簡単に折れるよう配慮されているので、それをまたぐようにGPIO用2x13メス端子を取り付けて折れないようにした。

ATmega328Pへのブートローダー及びドリトル用スケッチの書き込みは、手持ちのAVR ISP mkIIを使って、手持ちのUnoのATmegaを差し替えながら直接書き込んでおいた。なんだか普通じゃないと感じる人は正常で、あとで説明するけれども自作Arduino(USBなし)基板はシリアル関係で問題を起こすので、ISPから直接書き込むのがいちばん安定していたから。ブートローダーはUno用で全く問題がない。optiboot優秀です(Uno R3以後のもの)。FTDIかどうかに関係なく、きちんと書けます。

とりあえず第一号
第一号機はご覧のとおりであります。GPIOの端子を前後逆につけてしまったので、Arduino部分はRaspberry Piの基板の外に出てしまったけれど手遅れなのでこれはこのままとする感じ。

それで、何度やってもシリアル関係がどうにも正常に通信できず何日も悩んでいたのだけれど、値段をけちってセラロックにしていたのを、ふと思い立って横に作ってあったクリスタルのブレッドボード用基板をつないだらあっさり解決してしまいました。

秋月の値段ならセラロックをわざわざ選ぶ意味はないのだけれど、基板等の発注時にクリスタルを入れるのを忘れていたので、大須で調達しようとすると、国産品だと120円とかするのでひよったのが失敗の原因だったのか、なにか別の偶然だったのかはわからないわけですが、シリアルまわりで他と通信する可能性がある場合にはクリスタルを選ぶのをとりあえずおすすめしておきます。セラロックのときはFTDIとさえ通信できなかったんで、ハズレのセラロックだったのかもしれないけれど、ある種の教訓として心に刻むことにしました。

せっかくなので、ドリトルとお話ができている状態のビデオも掲載しておきます。

video

アナログポートにはなにもつながっていないので適当な値が出るのですが、この速度で実行できるのはOracle Java SE 8のおかげです。OpenJDKではこの3分の1以下の速度になってしまいます。

それで一応、Eagleで回路図と両面基板のレイアウトなんかもしたのでつけておきます。時間ないのにバカじゃないかと自己嫌悪するわけですが。

いま回路図みたらなんか一部壊れてますな。それはともかく、右の謎パーツは、SparkFunがEagle用ライブラリとして提供しているシールド基板でして、これを置くと、基板レイアウトのときに、シールド基板内部に部品が収まるように配置できてちょっとうれしかったりするわけです。左はGPIO端子です。GPIO 17をDTR(書き込み完了等のリセット)に使えという話なんで、そうしてます。

超適当に書いた回路図

それなりにがんばってみた基板レイアウト
GPIO用ソケットの1番ピンがへんなところに行ってますがこれは裏返したり回転したりしているうちにこうなっただけで、ワイヤの配置はたぶんあっているはずであります。

それと、受動部品とLEDがSMDになってるのはもちろんスルーホールがめんどくさいからでして、ユニバーサル基板でもこれからは手持ちのSMDパーツを使っていく予定です。ATmegaがそうなっていないのは、作った基板間違ってたとかの非常時でもCPUを救出できるようにしたかったからであります。自信あればTeensy互換(USB内蔵のATmega使用)とか余裕ぶっこきの設計にしてもいいんですけどね。

2014年7月18日金曜日

完全設定したRaspbianもしくはSDカードの内容のバックアップ方法

Raspberry Pi用に作成したSDカードだが、さまざまなカスタマイズを加えたものを増産したいという場合に、SDカード全体のイメージファイルを作成して別のカードに書く、ということを考えるかもしれない。しかし、市販されているSDカードの容量は意外と末尾が微妙に異なっており、あるカードから作ったイメージが別のカードに入らないことが往々にして生じる。
また、そもそも未使用部分が多いであろう場合に、カード全体をイメージにするのが適当なのだろうか、という素朴な疑問もある。

そこで、日本Ejectコマンド研究会会長にしてRaspberry Pi界の重鎮である、あっきいさんが書かれた、「NOOBS用カスタムOSイメージの作成」に触発を受け、実験してみたところうまくいったので報告しておく。

前提としてここでは、なにか別のSDカードに複製したい、オリジナルのSDカードがあり、さらに未使用もしくは再度利用する可能性のないSDカードがもう1枚があることを前提とした記述とする。

このためには、ext4ファイルシステムを理解するOSということで、Linuxマシンが必要となる。僕はUbuntu 14.4のマシンを用意した。

Ubuntuマシンに、オリジナルのSDカードを挿入すると、自動的に各パーティションすべてを一気にマウントしてくれる。それはつまり、bootパーティションであり、rootパーティションである。rootパーティションは、Raspbianのバージョンにも依存するかと思うけれど、6月20日版の場合、rootパーティションにはラベルがなく、 UUIDが直接マウントポイントになってしまう。

ここで、以下のようなコマンドを入力する。
# cd /home/xxxx/boot ←xxxxは自分のユーザ名
# tar cvpf ~/boot.tar .
# cd ../root  ←もしくは長いUUIDのフォルダ名
# tar cvpf ~/root.tar .
内容まるごとUbuntu側にバックアップすることになる。

次に、新しいSDカードにそれを入れたいのだが、Raspbianの設定に合ったパーティションの設定しなおしから始まる。

gpartedは、Linuxでは非常に便利な、ディスクパーティションエディタだと思う。Ubuntu側にapt-get install gpartedで入れておく。

最初はOSがSDカードをマウントした状態で、gpartedを起動する。すると、ドライブを/dev/sdbに切り替えられるので、ここでようやく[パーティション]→[アンマウント]でマウントを外してパーティション設定ができるようになる(外さなくてもできるときもあるようだけれどあまり深く調べていない)。

Raspbianのパーティション構成は、以下の通り。

  1. 先頭4MB―未使用
  2. 56MB―bootパーティション(fat16フォーマット)
  3. 残り(4GB SDカードなら、3260MB)―rootパーティション(ext4フォーマット)
  4. 未使用が若干残る
この構成でパーティションを切り直せば、新品のSDカードであってもあとは簡単だ。

バックアップした内容を、SDカードに書き込む。
# cd /media/ユーザ名/boot
# tar xvpf ~/boot.tar
# cd ../root ←もしくはUUID名。UUIDだと見づらいから、パーティションを切るときに「root」のラベルを付けておくとよいと思う。
# tar xvpf ~/root.tar
これであとは、syncでもなんでもしてSDカードをアンマウントして、Raspberry Piに挿し直せばすぐに起動することができる。おそらく、4GBより大きなSDカードに対しても有効だと思う。

2014年7月15日火曜日

Raspberry Piで、TightVNCserverの画面サイズを設定する

ノートPCをクライアントとして、Raspberry PiのTightVNCサーバに接続すると、Xvncのデフォルトジオメトリが結構大きいので、Windows 8ノートPCの安価なものだと液晶画面が1366x768というスナップ可能な最小限の画面解像度のことがあるので、縦が足りないということはよくある。TightVNCサーバを起動するスクリプト、つまり、/etc/init.d/vncserver に記述を加えることになろうかと思う。

vncserverコマンドを起動しているところ(start命令の処理内容)で、vncserverのオプションに、-geometry 800x600 などとしておき、
$ sudo /etc/init.d/vncserver restart
でよい。なお、800x600だと、シャットダウンボタンのアイコンが画面の下にぎりぎり見える程度のところに現れることがあるので、つまんで適当な位置に移動しておく。LXDEのlightdmの場合、移動前と移動後でアイコンが重なる位置にあると、ドラッグアンドドロップに勘違いされることがあるので、狙いからずれたと思ったら、いったん大きく外に出し、再度目的の場所に移動する必要があるようだ。
 
 

Raspberry PiのWiFi設定-DHCPから固定IPアドレスまで最速版

有線のLAN環境がないところでRaspberry PiのWiFiを設定する方法。いろいろ混乱があるようなので、2014年6月20日版Raspbianで最短(当社調べw)の設定手順を最短で書く。

Raspbianが起動している状態で、login: pi, Password: raspberryのデフォルトアカウントでログインしているところからはじめる。

$ sudo bash
# chmod 660 /etc/wpa_suoplicant/wpa_supplicant.comf
# wpa_passphrase SSID KEY >> $* ← SSIDもKEY(パスワード)も、特にダブルクォートなどで囲むことなく、そのまま書く。ハッシュしたほうに、それがKEYの文字として含まれしまい認証エラーになることがあるるようだ。
# vi $* ← 編集する。

内容は、以下のとおり。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSID" ←コマンドで指定したSSIDが入っている。
    key_mgmt=WPA-PSK
    proto=WPA2
    pairwise=TKIP CCMP
    group=TKIP CCMP ←ここまでの4行追記
    #psk="4332221111"←コマンドで入力したまま
    psk=9a7cdfea2bbbda47edacc95b2ae7a1c..... ←長いハッシュされた鍵が生成されている  
}
複数のWiFi接続先があれば、上のwpa_passphraseコマンドでのハッシュを含むnetworkエントリ生成から、4行追記を繰り返す。

続いて、/etc/network/interfacesファイルの編集。Raspbianの設定のままではWPA2のWiFiスポットに接続しないので、それをまず直す。
auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp ←なぜか"manual"になっているが、素直にdhcpするように直す
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf ←wpa-roamはwpa-confにしておく
iface default inet dhcp
この状態で、
$ sudo ifdown wlan0
$ sudo ifup wlan0
するとDHCPでのアドレス取得がいつまでたっても終わらないので、迷わず上記はやらずにsudo reboot。

WPA2のSSIDと共有鍵さえ間違っていなければ接続できるはず。逆に、いくらやっても接続できないなら、記述を見なおすとか、wpa_passphraseを再度実行するのもよいかもしれない。また、WiFiドングルが2.4GHzまで対応なのか5GHz対応なのかで違ってくるので、2.4GHzまでの安いものを使うなら、WiFiスポットが2.4GHzでの接続に対応するよう設定しておく。記述は正しいと考えれれるのにつながらないならWiFiルータの再起動で解決することもある。

ここで、/etc/resolv.confの自動生成をするパッケージresolvconfを入れる。
$ sudo apt-get install resolvconf
$ sudo service resolvconf start
WiFiでDHCPにより接続できているはずなので、apt-getなども問題なくうまくいくはず。だめなら設定を見なおすとかエラーメッセージをよくみて考えるなどして解決する。ときには、WiFiルータ側を再起動する必要があるかもしれない。特に混雑しているAPは、新たに一台追加する余裕がないときがあるので、ルータ再起動でいちはやく接続を勝ち取るのは有効な戦略。

最後に、固定IPの設定に変更する。/etc/network/interfacesをそのように書きなおす。
auto lo
iface lo inet loopback
auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet static ←固定IP設定を宣言して、以下パラメータを入れる。
address 192.168.1.xxx ←使う予定の固定IPアドレスを書く
netmask 255.255.255.0 ←接続するネットワークの設定に合わせる
gateway 192.168.1.1 ←default routeを決めるので、ネットワークの設定に合わせる
dns-nameservers 192.168.1.1 ←/etc/resolv.confの設定にかかわる。ここではWiFiルータを指しているがいつまでも安全とはいえないので、ひとまず信頼できるDNSを書いておくのは悪くない(が、8.8.8.8は愚の骨頂だと思う)。
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
「address」から「dns-nameservers」までの追記が正しければ、以下の手順でうまくいく。
$ sudo ifdown wlan0
$ sudo ifup wlan0
このときに、「can't read /etc/network/interfaces」などと出たら、そのファイルの記述が誤っていないか確認すべき。

あとは再起動しようがなにしようがWiFiで固定IPの設定が維持されるはず。 

2014年7月5日土曜日

Eagleでプリント基板のデザインをして発注するまで(追記あり:ドリルデータとドリルリストについて)

来週末は、勤務先のイベントで小学生対象の「ものづくり教室」の担当。去年実施したのが、Parallax社の8 core 32bitマイコンであるPropellerを使った、ドラムシンセサイザーだった。

内容は、Propellerのプロジェクトとして公開されている、Amiga Commodor 64の音源チップSIDエミュレータを使い、シンセドラムっぽい音をプログラムで自作したもの。欧米を中心に「SID Tune」という分野があって何千曲ものデータ蓄積があり、SIDはレジスタに書かれたパラメータに合わせて音響信号を出すだけのLSIなので、プログラムで高速制御して見事な効果を含む演奏する専用プログラムがあったほど。いまでも「SID Emulator」が各OS用にいろいろあって、バイナリに変換されたSIDレジスタ書き込みシーケンシャルデータを読み込んで再生することができる。それらには及ばないものの、僕もPropellerマイコン内蔵インタプリタを直接呼び出す言語「SPIN」で、様々に試行錯誤を突貫で行って、まぁなんとかできたという感じだった。

もともとの志は高かった。叩く部分、通称「パッド」にピエゾスピーカーを仕込んで、高速なA/Dコンバータならば、衝撃力に応じた電圧をばっちり計測できるところまで実験は済んでいたのだが、使ったチップがAnalog DevicesのADC124S021というもので、これはParallaxのActivity Boardという実験用基板で採用されているので、カリフォルニア本社まで出かけて諸々懸案を電子エンジニアと相談して解決したものだった。

ところが、このADC124S021はTSSOP10という、足の間隔が0.5mmの表面実装パーツで、DIP変換基板を使わないと自作基板の実験さえできないし、当時はDigikeyにしか在庫がなく、たしか1個400円ぐらいだったような気がする。10名参加で、このADCは4channelなので5つのパッドのためにひとりあたり2個、故障やはんだ失敗などを見込んで全部で30個を買った。DIP変換基板で0.5mmピッチの10pinで手頃なものはたまたま在庫がなく、Aitendoの18pin用をカットして使ったりした。それで、変換基板への手ハンダはうちの学生さんが職人技でやったんだけれど、そのあとピンヘッダを、教室実施の前夜にものすごくおおざっぱにつけたおかげでADCが浮いてしまい全部オシャカ(ICは生きているはずなんだが足を直す時間なし)という衝撃の事態があり、タクトスイッチに置き換えることになったりした。

アンプは、Activity BoardはRail-to-Railのオペアンプを使ってΣΔDACを組んで、たいへん良好な音を出していたんだけれど、カネが続かないので秋月のいちばん安価なオーディオ・アンプを選択したのが敗因で、すごくS/Nが悪く(あとから、秋葉原の店頭でアルバイトの男子学生さんっぽい従業員に尋ねたら、「僕も試してみたんですけどたしかにノイズ多いです」と答えてくれた)、回路が同じでも実装のしかたで音が全く違ってしまい、ブレッドボードで最適な増幅度とS/Nを見出しても、ユニバーサル基板に組むと、どれもまともな音が出なくて個別に調整というたいへんな思いをした。

そんな疲労困憊の記憶があるので、今年は両面基板を製作してリフローするんだと決めていたわけなんだけれど、PCBミルを自作してみたものの経験が足りなくて0.1mmの精度は出せず、そうしているうちにFusion PCB(安くて早いので有名な深圳のSeed Studio社のサービス)のリードタイムにも間に合わないことがわかり、最短翌日出荷に対応する、静岡県磐田市の「プリント基板センターPB」さんにお願いすることにした次第。前日到着は怖いので木曜到着を考えると水曜出荷で、金曜日に受け付けても月曜からの計算になるので3日コースということになった。この工場ですけれど、見積をオンラインでざっくりできるのでみていただきたいですが、特急であることを考えたらかなり安いほうだと思います。納品したガーバーデータも夜遅くまでひとつひとつチェックしてくださって、対応はとても良好な感じです。

まぁそういうわけで、3日寝ないで名古屋まで出かける非常勤講師の授業もこなしたりしつつ作ったのがこれ。ちなみにその前日までは、前エントリーのRaspbianのSDカード量産なんかをしていたので、週末から数えてやっぱり全く寝ていない。

Eagleの画面
SMD部品のサイズがいろいろなのは入手できたのがそれしかなかったから

今週末もArduino量産とかいろいろあるので徹夜が続く予定。

それはともかくEagleなんだけれど、回路はぶっちゃけActivity Boardの流用(オープンソースハードウェアです)に、去年の夏のノウハウが入ったものなので、回路図はライブラリを集めるのに苦労したけれどわりとさっくりできた(徹夜をはさんで2日でできた)。問題は図の右下をみていただくと気づかれるかどうか、スライドスイッチが裏面にあるわけです。

ケースも3Dプリントしたものを使うのだけれど、小学校3年生がネジ止めで工作できる範囲というと、ケースの上面にはスピーカーと電源スイッチ、電源ランプ相当のチップLEDの窓がある形にならざるを得ず、簡単で安価なのは基板をフタにネジ止めすることで、したがって電源スイッチとLEDが基板の裏面にあって、表面から電池ボックスのコネクタやスピーカーの端子にアクセスする形をとることになるというわけ。

ここでようやく本題。Eagleは部品を裏にまわすには、基板エディタでパーツを選んで「Mirror」ボタンを押せばいいのだけれど、それは表面実装部品の場合で、Padがあるスライドスイッチはそうはいかない感じでありました。シルクは反転して裏面に行っている感じなんだけれど。それでPadの上に同じ形のSMDパターンを置いたりなんだとやったら、当然ERCでも文句言われるし、オートルーティングでも無視されたりするわけです。

しかたがないので手で配線を引いてやるわけですが、そのあとのオートルーティングもベタパターンもどうも具合が悪い。

やむなくライブラリを手編集すべえと調べてみたら、ライブラリ(.lbrファイル)ってXMLのテキストファイルなのですね。で、DTDはdocの下にあるeagle.dtdなんだと。それで、DTDの<pad>タグの定義にLayerを追加したりとか変なことをしているうちに、「Info」ボタンから「Properties」を開いてやると、「mirror」というチェックボックスがあるじゃないですか。それチェックしたら、TOPレイヤーにPadが描かれて(緑色のPadの上に赤のクロスハッチが上書きされた状態になる)、これでオートルーティングかけると何事もなかったかのように未配線を残さず完了するわけで、ここまでたどりつくのに3時間かかってすごく残念な気分になりました。

これをチェックすればスルーホール部品でも裏面に移動できる

Eagleのネット上での説明というと、「EAGLEによるプリントパターン自動作成」が唯一まともな資料として他の説明もすべてそこにリンクされているわけですけれども、両面基板だとかSMDだとかのことは書いてないわけです。そもそも、最終工程がエッチングなのでして、基板発注をお安く個人がする時代のちょっと前の記事です。

そういうわけで、ガーバーデータを出力するのは、例えばCuBeatSystemsさん(個人)のページとかが簡潔にまとまっているのかな、というところ。ガーバーデータを確認するビューアは、3Dプリンタがらみでいろいろ入れているのでいつのまにかgerbvが入っていたのでMacでもことなきを得た感じ。

(追記:「ドリルデータとドリルリストがありません」とのご指摘をプリント基板センターPBご担当者様からいただき、急ぎ送信しました。諸々は「P板.com」さんの手順と同じなんだろうと思うので、Cam Processorのジョブでexcellong.camを実行する形で作成したんですが、ドリルデータってG-Codeなんですね。へえって思いました。2014-07-07)

あと、今回はプリント基板センターPBさんに、特別にメタルマスク(英語的にステンシルというと思っていたんだけれど、それでは通じないんですね)も製作してもらうことにしたので、メタルマスク出力用の設定追加は「Eagleでメタルマスク用ガーバーデータを出力する」のブログエントリをみて実施しました。

当初の構想では、カッティングマシンでコート紙でも切ればいいやと思っていたけれど、最小ピン間0.15mmなんでたぶん無理だろうと。試行錯誤している時間がないからプロに頼むと。

いずれにせよ、プリント基板製作にもメタルマスク作成にもCNCミル使っているはずなんで、自作するなら手堅くプロクソンのフライス盤をCNC化していく方向から経験を積んでいかねばならんだろうなと思っているところ。

そして、レジストとシルクなんだけれども、レジストは塗布後にマスクを印刷したフィルムを載せて紫外線に当ててから洗えばいいのかと。参考

シルクは、インクジェットプリンタでプリントゴッコ(昭和の記憶)的にやるのが簡単そうだなと。参考

あとはあまり考えたくないんだがリフロー前のマウンタも自作したりしたら実装の内職できるんじゃないかみたいななにか。

そういえば、クリームはんだ(はんだペースト)をまだ買ってないのだった。大昔にシリンジに入ったのを買ったのがどこかにあるはずだが、フラックス足せば古くても使えるとか読んだんだがそれで足りるのだろうか。アマゾンで65gの瓶が3000円で出ているが、価格を出している業者を見ると980円なんで、えらいぼったくりだなと思ったり。参考

それで、検索すると「クリームはんだ印刷機」というのがいつもトップにあるんだけれど、いまどきはマスクみたいな再利用がきかないものは作らないんですね。ついでに「クリームはんだロボット」という見出しが別に見えたので、もしかすると3Dプリンタのエクストルーダ改造で、シリンジ入りのソルダペーストをプリントできるんではないかと思った。