RaspberryPiにケースを作る。100円で。

 特に実のあるエントリーではないです。

 RaspberryPiがきたものの、裸で使うのは……

 一緒にケース買っておけばよかったかな、と思う物の、どうやら某巨大掲示板では、ケースと一緒に買った人は未だ来ていなかったりするらしい。
 でもこのまま使うのもなぁ、と思ったので、ケースを作ります。

 材料はコレ。
 

 100円均一の、名刺ケースです。
 いつぞやArduino評価キット作ったときに使ったハガキケースと同じ系統です。
 材質がポリプロピレンなんで、柔らかくて加工しやすい。

 これに、RaspberryPiに発泡スチロール片で足をつけた物を入れてみて、好きな位置にした後、おもむろに油性マジックで、開けたい穴の目安を描いていきます。
 

 あとは、中身出して、ピンバイスとカッターと根性で加工。
 

 こんな感じになりました。
 

 天面の穴は、裏面にも付いてます。割とあったかくなるんで、適当に冷やす物を差し込む穴です。ネジかなんかに鉄板半田付けして差し込む予定。でも、表裏に穴があいてるだけで、冷たい空気が下から入って、上に出てるような感じもします。

RaspberryPiでコンパイルとかせずにWifiドングルを使う(US-GWMicroNとか、ralinkの)

 どうも、こんにちは
 もう少し頻繁に書こう、そう思ったりしなかったり。
 
 さて先日、RaspberryPiが届いたのですが、
 USBx2と、HDMI、100MbpsのLANしかインターフェースがありません。
 自宅サーバならぬ外で使うサーバ的に触ってみたかったので、彼にはどうしても装備してほしかったものがあります。
 無線LAN

 家にあるのは、PlanexのUS-GW MicroNというものですが、こいつを装備してみたいと思います。

 ralink製のチップっぽいです。2870っぽい。
 とりあえずRaspberryPiに挿してみると、なんととりあえず認識はされてます。

 この調子で、Ubuntuで使う為にやった設定と同じ事をしてみようかと。
 大量にsudo叩くのもあれなんで、まずsudo suしておきます。ほんとはこういうのはよろしくないのかな。

 まず、aptで、firmware-ralinkと、wireless-toolsを入れます

apt-get upate
apt-get instal firmware-ralink wireless-tools

 多分、最新が入ってるぜ、と言われますが、まぁ一応確認。
 そんなら、今モジュールは読み込まれてるのかな、と、lsmod叩きますが入ってないです。
 なので、起動時に読み込まれるように、/etc/modules に、追記します。

#vi /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835
rt2800usb

 こんな感じで、最終行を追加します。

 今度は
 /etc/modprobe.d/gw-usmicron.conf とかなんかファイルを作って、
 中身を以下のようにします。

install rt2800usb /sbin/modprobe --ignore-install rt2800usb; /bin/echo "2019 ed14" > /sys/bus/usb/drivers/rt2800usb/new_id

 echoでやってもらっても、viで編集してもらっても良いです。2019 ed14はお持ちのドングルに合わせてください(lsusbの結果です)

 出来たらまずリブート。

 その後、再度立ち上がったら、またsudo suしてrootになってから、

modprobe rt2800usb

 これで、おそらくもう使えます。
 lsmodの結果は以下のようになってると思います。

Module                  Size  Used by
aes_generic            36429  1 
arc4                    1319  2 
rt2800usb              12510  0 
rt2800lib              49181  1 rt2800usb
crc_ccitt               1541  1 rt2800lib
rt2x00usb              12077  1 rt2800usb
rt2x00lib              43890  3 rt2x00usb,rt2800lib,rt2800usb
mac80211              253889  3 rt2x00lib,rt2x00usb,rt2800lib
cfg80211              180459  2 mac80211,rt2x00lib
snd_bcm2835            21485  0 
snd_pcm                82208  1 snd_bcm2835
snd_seq                59808  0 
snd_timer              21905  2 snd_seq,snd_pcm
snd_seq_device          6920  1 snd_seq
snd                    57668  5 snd_seq_device,snd_timer,snd_seq,snd_pcm,snd_bcm2835
snd_page_alloc          5383  1 snd_pcm
evdev                   8922  2

 ※使えなかったら、再度リブートしてみてください。
 ifconfig叩いてみましょう。

 :
 :
wlan0     Link encap:イーサネット  ハードウェアアドレス 00:xx:xx:xx:xx:xx 
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000 
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

 なんて感じで出来てると思います。
 
 後は、僕はコマンドラインから無線LANの設定をするのが面倒なんで、wicdで設定しちゃいます。

apt-get install wicd

 でインストールしたあと、Xを起動。
 メニューで言うと、インターネットの下に「Wicd Network Manager」があります。
 コレを起動すると、Windowsでよく見るような、ネットワーク接続のマネージャ的なのが出てくると思います。
 あとは、これで設定しちゃえば、普通に使えます。

Raspberry PIが来たから動かしてみた+とりあえずArduinoとお話して

Raspberry PIが来たから動かしてみた+とりあえずArduinoとお話してみた。

はじめに

 お久しぶりです。
 プライベートで超色々あって、もう大変なのですが。
 とりあえず。

 6/25にオーダーして、11週待ちね!って言われてたRaspberry PIが我が家にやってきました。

 7/30日に、gmailにRSとDHLからメール来てました。予想外に早い。
 送るよ、送ったよ、この番号でトラックしてね! と言う事で、仕事の合間やらにちょっとずつチェック。

このへんはしょっていい部分ですけど、こんな風に来ました。

 英バーミンガムで集荷して、英イースト・ミッドランズまで送られて、さらにそっから独ライプツィヒ、その後香港を経由して大阪に、なんと3日で来ました。DHL凄い。
 ただそこからがちょっと面倒で、大阪から配送が始まった後、「受取人不在のため保留」とか言ってる。
 あちゃー、と思って、昼休みDHLに電話して、再配達してくれ、できたら20時ぐらいに、って言うと、
「いや、20時は無理」「じゃあ19時は?」「無理です」「何時までならいけるの?」「17時ぐらいでしょうか」「じゃあ取りに行ってもいいけど、営業所は何時まで開いてるの?」「頑張ってお待ちするとして20:30」「場所は?」「大阪港の……」
 と、完全に国内配送にやる気が無い。
「でも、土曜日にしかそんな時間に居ないし、土曜日居るかもわかんないし、出来たら平日の20時ぐらいに送れないの?」
「あ、じゃあ佐川さんに、引き継ぎますね。明日の便の20時で配送かけます」
 なるほどそういう事か。

 と思って、昨日帰って不在票が入って無かったのが多少気になったのですが、ちゃんと来ました。

開梱の儀

 案外チャチい感じの梱包の中に、段ボールでこんな感じに入ってました。

 

 開けると、結構厳重にスポンジとか敷いてあって、あのHDDが入ってるようなフィルムに基板が。
 さらにそれを開けてみるとこんな感じ。小さい!

 

 ちょっと低めですがそれでもテンションが上がったので、とりあえず、家にある物で動作検証する材料を調達する事に。
 ・セルフパワーのハブ
 ・電源用のUSBケーブル
 ・USBキーボード
 ・USBマウス
 ・4GのSDカード
 ・HDMIケーブル(普段はMacとテレビを繋いでる)
 ・LANケーブル

 LANは、この部屋には有線LANが無いので、Mac無線LANを共有して、有線LAN同士を繋ぎました。逆はよくやるんだけど、これは始めてやったな……
 ちなみに、クロスケーブルを用意しなくても、どうやら自動認識とかでストレートケーブルで繋げます。

SDカードにOSをインストール

 で、SDカードに、OSを入れます。
 Android ICSなんかも面白そうですが、Debianがなんと、Raspberry Pi用にビルドされてるというかカスタムされてる公式パッケージ「Raspbian “wheezy”」があります。

 Ubuntu使う前はずっとDebian使ってたので、これがいいや、と公式サイトからRaspbianのイメージをダウンロード。
 SDカードリーダをMacに繋いで、一度アンマウントします。(イジェクトではなく)
 僕はディスクユーティリティーからやりますが。

 ターミナルで、そのまま

sudo dd bs=1m if=...img of=/dev/rdisk1 ※環境によって違います。

 を叩く。何も表示されてなくて不安であれば、Ctrl+Tを押してください。

 あとは、終わったらイジェクトします。

 ※このイメージは実は2G分しか無いのですが、最初のセットアップ的な画面で、SDカードのサイズまで拡張、ができます。

起動

 とりあえずこのSDカードをRaspberry Piに差し込んで、色々繋いでおもむろに電源を入れます。

 

 

 おぉ、起動した!
 とりあえず、最初の画面で色々設定出来るので、Localeの設定したり、ユーザのパスワード設定したり。

 最終的にリブートを求められて、リブートすると普通のLinuxとして起動します。

 で、起動メッセージ通りstartx

 結構ぐりぐり動きます。
 

 が、なんと、Localeをja-JP UTF-8にしちゃったもんだから、色々日本語を出そうとして、全部化けてる。
 

 日本語フォントが入ってないだけなので、

sudo apt-get update
sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese

 で日本語関係を入れます。

 
 ごちゃごちゃーっとなりますが、Yでいいです。

 いったん左下のアイコンから、電源っぽいのを押して、ログアウトし、再度startxをすると……

 
 日本語が出るようになります。

 この状態で、せっかくなのであれやってみましょう。

Arduinoを繋ぐ。

 本当は小さいDa Vinciでやってみたかったんですが、とりあえずUNOを繋いでみました。
 しかもUSBで。だってPIのGPIOは3.3Vだし。

 UNOに入れたスケッチはこちら。

int incomingByte = 0;  

void setup(){
	Serial.begin(9600);
	pinMode(13,OUTPUT);
	digitalWrite(13,LOW);
}
void loop(){

	while(Serial.available()>0){
		incomingByte = Serial.read();
		if(incomingByte<(int)'1') continue;
		if(incomingByte>(int)'9') continue;
		Serial.write(incomingByte);
		incomingByte=incomingByte-(int)'0';
		while(incomingByte>0){
			digitalWrite(13,HIGH);
			delay(250);
			digitalWrite(13,LOW);
			delay(250);	
			incomingByte--;	
		}
	}
}

あとはpiから、シリアルで出力してみる。
cuは標準で入っていないので、sudo apt-get install cu
UNOなら、/dev/ttyACM0として認識されるので、

cu -l /dev/ttyACM0 -s 9600

これで、PI側で数字を入力したとき、その数字の回数、LEDがチカチカします。
ついでに、PIに、入力した数字がエコーバックされます。
こんな感じ

 これで、フィジカルな入出力と超小型マザーのPIとのお話が出来るようになりました。
 夢がひろがりんぐですね。遊びようが幾らでもありそうで、凄い。
 Webカメラと、OpenCVと、Arduinoとで、視線入力デバイスの研究の続きでもやりましょうかね。

Arduino IDEのシリアルモニタがいちいち閉じるのがイラっとするからシリアルモニタ作った

 (ほぼ同じテキストが、サイトの方にもあります。)

 Arduino IDEでスケッチのアップロード時、シリアルモニタが閉じるのイライラしませんか?
 僕だけでしょうか。

 あまりに腹が立つので、TeraTerm?なんかでシリアル見てると、今度はIDEの方がスケッチをアップロード出来ない事に気づきます。

 要は、アップロード中にシリアルが開いたままだと、avrdudeがアップロードするときにシリアルが開けないから、シリアルモニタが閉じるんだと思います。
 一時的にポート開放して、avrdudeが終われば再接続してくれるだけでいいのに。

 ってことで、avr-gccとavrdudeが起動中だけシリアルを閉じる機能のついたシリアルモニタっぽいの作ってみました。Windows用です。

 画面はこんなの。

 

 ダウンロードはこちら
 acterminal

 以下readmeから引用


 1.説明
   Arduion IDEがアップロード時にいちいち閉じるのに腹が立つ
  ため、作成したシリアルモニタです。
   起動には.Net Framework 3.5ぐらいが必要です。

 2.機能
   見たまんまの機能しかないです。

   下のコンボがCOMポートとボーレートを選択する部分です。
   COMポートは起動時に存在するのを列挙しています。
   先に選択して「接続」ボタンで接続できます。

   「切断」/「接続」ボタンは現在の状態を表示すると共に、
  押した側に切り替わります。

   「ログクリア」で消えます。

   下の細い部分とSendでシリアルに文字列を出力します。
  \t\r\n\0も送れます。

   Verfy& ... にチェックが入っていると、avr-gccかavrdude
  が起動したら切断します。

   avrdude終了後 ... にチェックが入っていると、avr-gcc
  なんかが終了したのち、avrdudeが一度起動して再度プロセス
  から居なくなってから再接続します。

   avrdudeが一回も起動しなければ、右のタイムアウト値待って
  再度接続します。

 3.その他の設定

   一度起動して終了すると、アプリケーションと同じフォルダに、
  setting.xmlが出来ます。
   画面から設定できない設定は、XMLを直接編集して設定
  できます。
  (変な設定値だと、落ちます)

 4.注意事項
   COMポートがなければ即落ちます。

Da VinciをやっぱりArduinoとして使ってしまって気付いた事。

 昨日、結局FLIPを使わずDa VinciをArduino Leonardo互換ボードにしてしまいましたが、何故そうするのか考えてみました。


 わざわざArduinoに批判的な人の言う「不自由な環境」にしてしまったわけですから。


 考えているとだんだん、逆に、何故それほどまでに自分がArduinoを使うのか、と言う問題に頭がシフトしました。
 1.(半)完成品である事。もしくは、完成品のクローンであること。
  つまり、8MHzであろうが16MHzであろうが、クリスタルであろうがセラロックであろうが、知りたい物はいざとなれば「動く物を手に入れられる」。それも、必要十分かつ共通の回路を。
  たとえばPICやATTinyの作例なんかをみると、それにしか使えない物だったり、回路図に余計な物がついていたりします。
こっから、自分が使いたい物へ持って行くのもホネだし、逆に、自分が作った部分とボードの部分の切り分けが難しい。
  ここで、最初からメインボードをUNO互換、とか、mini互換、とか、Leonardo互換にしておけば、本物のUNOやらなんやらを繋いで、モジュール単体の試験が出来るわけです。
  逆に、モジュールをUNOに繋ぐと動くのに、モジュールを自作Arduino互換ボードに繋ぐと動かない、なんてのは、自分が作ったボードの方が悪いって事です。

 2.Arduinoっていう「枠」があること。

 自由さが至高だと思ってる人は結構居ます。

 たとえば「書こうと思えばアセンブラでも書けるし、Cでも書ける。ライブラリってのはたとえば○○するには、△△と××ってのがあって、どっちを使ってもいいよ、好みです」

 これは凄い事かもしれない。実際、プログラマーって人種はそういうのを使いたがる。
 でもこれは職業プログラマをやっていて、大きく作る側と使う側で認識が異なる事を理解した。

 以下自分が気にしている事。

 1.同じ事が2種類以上のやり方で出来る場合は、どちらを何故推奨するかかならず明記する。
  ※どっちでもいいですよ、ってのは、全く答えにはなっていない。
  どっちでもいいからやりたいんであって、使う方にだって実はどうでもいい。そんな自由は実は要らない。逆に「これでしか出来ません」だったら、ブツブツ文句は言われるかもしれないけど、何も悩まず使ってくれる。

 2.出来れば、やり方と機能は1:1に結びついているべき。違う事をしたのに同じ事が起こる、同じ事をしたのに違う事が起こる。これは「たとえマニュアルに書いているとしても」やってはいけない作り。
  押したら交互に機能がトグルする、ってボタンなら押しこみ式のトグルボタンにして色が変わるとかで充分じゃない、とか思うかもしれないけど、実は2つの、「片方を押せば片方が出てくるラジオボタン」とか、左右に動かすスライドスイッチを用意するべき。だって3つ以上になると困るし。あと、PCだと、トグルなのに押したらキャプションが変わるとか意味不明。「分かりにくい」とキレられても仕方ない。
  人によってはボタンを連打する人も居る。

 3.人に教えてもらう時に、ちゃんと教えてもらった通りにやれば、その通りの結果が出る事。
  ※「適宜、環境に従って読み替えてください」はマニュアルとして確実に間違っている。それが知りたくて聞いたのに、自分で読み替えろとはどういう事だ。
   「xxxx(ウィンドウズで動かす場合は適宜読み替えてください)」とかよく見るけど、どうしてもの例外ケース以外、ちゃんとマニュアルを別個に書けと言いたくなる。

 4.枠を超える事が出来る仕組みも、枠で決める。
  あとは勝手にしてください。ってのは、とてもよろしくない。
  「勝手に拡張して○○ってのを作ってみたんだけど、どうも動かないんだ」こんな質問に答えられるわけがない。
  こんな感じで、これを拡張してくださいね、ってスタブを提供できれば、より良い。
  そしたら「えーっと、まず、一旦コード全部削って、スタブで固定値返すと動きます?」とか、「作った物単体では動きます?これ、単体を一通りテストするモジュールですのでお貸しします」なんてやりとりが出来る。

 この辺に対して、Arduinoはとてもうまい感じでやってます。

 使うのはIDE。言語はArduino言語
 C++に毛が生えたような言語。
 これでいいのです。
 これの上で作っていれば他の環境に持って行っても、下回りが旨く隠蔽してくれてそれなりに動くと言うのがポイントです。
 PORTB |~ _BV(1) よりも、よっぽど素直。

 あと、(4)も大事です。自分は普段シールドを「要らない」と言いまくってるが、実はあれは凄い物なのです。
 もちろんクローンから使う時も、Arduinoでのピンアサインさえわかれば簡単に繋げますしね。

 ピンアサインに関してもいろんなMCUでいろんな名前で呼ばれてる物に対して、「Digital 0〜14」「Analog A0〜A5」と名前がついてる事すら便利な物だと思います。

 こう考えたときに、よく出来てるなとも思うし、デメリットを考えてもArduinoが便利だなぁ、と思う感じ。
 ましてやDa Vinci。次に人に勧めるときは、多分これを薦めると思う。だってほんとに安いし。
 PICの充分なスペックのMCUを二つ三つ買う値段で、USB直結のこれが買えちゃって、統一したAPIがあって、人に聞けて。

 Leonardoになって多少難しくなっちゃったけど、結局Arduinoを勧めると思う。結局WinAVRで組むことになろうが。

レオナルド互換基板[Da Vinci]にArduino-ISPでUNOでブートローダを書き込む。

 ほぼ同じテキストが、サイトの方にもあります。


 先日、日本橋共立で1200円程度で発見。
 HIDでのキーボード関係を触りたかったので、思わず購入してしまいました。


 が。


 ブートローダArduinoじゃなくて、FLIPというやつでした。
 まぁ、どっちも同じ値段なんですけどね。でも見た感じFLIPとやらの方しかなかった。


 ブートローダ書き込んじゃえばいいや、と思って共立ライタ繋いでも、芳しくない。


 なんと、共立ライタがATmega32U4に対応していない!!


 これは困った。どうやって書き込もう。
 FTDIモジュールは、あくまでシリアルとして使いたい。
 それに成功例ばっかだし。


 と言う事で、敢えてArduino ISPを使ってみました。



・使った物

 Arduino UNO(R2)
 110Ωの抵抗。
 Da Vinci



・手順

 1.Arduino UNOが素の状態の時に、先にexamplesのArduinoISPを書き込んでおいてください。

 2.StrawberryLinuxのページから、da-vinci-32u.zipをダウンロードしてきます。
  ブートローダのhexとか、ドライバとか、boards.txtが入ってます。

 3.Arduino IDEのboards.txtに、ボード定義を足す。
  StrawberryLinuxのページに修正済みboards.txtがあるので、それを使ってもいいです。

 4.ダウンロードしてきたda-vinci-32u.zip内の、「da-vinci-32u-master.hex」を、
 「davinci.hex」とリネームして
 「arduino-1.0.1\hardware\arduino\bootloaders\caterina」に放り込みます。
 なぜboards.txtの方と名前が違うのかはよく分からないです。

 5.つなぎます。
 Arduino UNOと、Da VinciのISPコネクタは、

 Da Vinciを上から見たときのピン配置が

  -------
 |1|2|
  -------
 |3|4|
  -------
 |5|6|
  -------

 なんで、それぞれをArduinoにこの場所に繋いで下さい。

  -------
 |12|5V|
  -------
 |13|11|
  -------
 |10|GN|
  -------

 って感じに。

1:MISO
2:VCC
3:SCLK
4:MOSI
5:RESET
6:GND

 って事です。

 6.Arduinoの5Vと、RESETを110Ω〜160Ωで直結。
  これをしておかないと、ターゲットをリセットするときにUNOまでリセットがかかってしまいます。
  僕は手持ちが無かったので、330Ωを並列に二つ繋ぎました。

 7.Arduino IDEのTargetを[ツール]-[マイコンボード]から「Da Vinci 32U」に設定。

 8.同じく、[ツール]-[書込装置]から、Arduino as ISP

 9.[ツール]-[ブートローダを書き込む]で、ブートローダを書き込みます。

10.表示が「ブートローダの書き込みが完了しました」になれば完了。
  あとは、Da Vinci 32U with Arduino Bootloaderとして使えます。

  Da VinciとArduino UNOの結線を外して、Da VinciにBlinkを転送し、正常に転送が出来る事、光る事を確認してOKです。

サイト更新しました。「Arduino+LCD+SD+USB+ブレッドボードをひとまとめにした便利ボードを作る」

 ひさびさにがっつり制作して、ひさびさにがっつり文章を書いて、
 図面も引いて写真も撮って、サイト更新しました。

 Arduino+LCD+SD+USB+ブレッドボードをひとまとめにした便利ボードを作る。

 3本線で1602を制御したり、200円ぐらいでSDカードをArduinoにつないだりと、そんな内容です。

 動いてるデモはこちら。