0

Mac OSXにおける近代的なAVRマイコン開発環境

久しぶりにAtmel AVRマイコンを直に使うプロジェクトをやるので、環境を整えてみた。@rain_yukizoraと@qt_fbが色々教えてくれた。



これが最強の組み合わせだ!!


この記事では、MacでのAVRマイコン開発環境の構築と、ATMega168pでLEDを1秒間隔で点滅させるプログラムを作成して、マイコンに書き込んで動作させる所までを解説します。


Macbook Air + usbasp + ATMega168pで開発しているところ
AVR and Mac



■Cross Pack for AVRをインストールする
CrossPack – A Development Environment for Atmel’s AVR Microcontrollers
ここからダウンロードしてインストールする。
普通は /usr/local/CrossPack-AVR にインストールされるはず。


■usbaspを買う
aitendoで売ってるusbaspを買う。
これはMacからAVRマイコンに書き込みをする機械(writer)で、USBで動作するライターの中で最も安いし対応デバイスも多いのでオススメ。
朝買ってすぐ銀行に振りこんだら昼には発送されてた。


■XCodeをインストールする
次の項目のmacportsのインストールのために、XCodeが必要なのでインストールする。
Developer Downloads & ADC Program Assets

有料のXCode4が最新だけど、無料の3系でも良い。


■Macportsをインストールする
macports.orgからダウンロードしてインストールする。


■macportsとCross Pack for AVRのPATHを通す
$HOME/.profile を開く(無ければ作る)

これを下の方に書く
export PATH=$PATH:/opt/local/bin
export PATH=$PATH:/usr/local/CrossPack-AVR/bin

新しいterminalを開いて、PATHがセットされているか確かめる。
echo $PATH


■macportsでavrdudeをインストールする
Cross Pack for AVRに入っているavrdudeはUSBで使えないので、USBで使えるavrdudeを作る。
sudo port install git-core libusb avrdude
which avrdude

/opt/local/bin/avrdude が出てくればok。Cross Packの方が出てきたら、前のPATHの設定の順序が間違っている。

(homebrewでもavrdudeがインストールできるが、libusbを先にインストールしていても使えない。よくわからない。)


■avrdude.confにATMega168pのデバイス設定を追加する
ATMega168pを使う人だけ。168や328pを使うなら必要ない。
https://github.com/shokai/atmel-avrgcc-studyからavrdude.confをダウンロードしてきて、 /opt/local/share/avrdude.confと入れ替える。

git clone git://github.com/shokai/atmel-avrgcc-study.git
sudo cp /opt/local/etc/avrdude.conf /opt/local/etc/avrdude.conf.bak
sudo cp atmel-avrgcc-study/avrdude.conf /opt/local/etc/avrdude.conf

このavrdude.confはmacportsでインストールしたavrdude.confに、Kimio Kosakaさんが作ったavrdude.confにあったatmega168pの設定を追加した物です。




これで環境は整ったので、プログラムを書く。
俺が作ったプログラムは https://github.com/shokai/atmel-avrgcc-study/tree/master/28pin/led_blinkにある。これをそのまま書きこんで動かしても良いと思う

■avr-gccプロジェクトを作る
LEDを点滅させるプロジェクトを作る
avr-project led_blink
cd led_blink/firmware
make
xcode用のファイルも生成されるが、xcodeを使っても全く意味が無いので無視する。

プロジェクトをそのままいきなりコンパイルして、バイナリ(.hexファイル)が作れるか確かめる。



■ATMega168pで回路を組む

写真を見て回路を組む。
左の2つのLED(PB0, PD7)が交互に1秒ごとに点滅する。右のLED(PB1)はスイッチ(PB2)を押している間だけ点灯する。
R0015973R0015976


ATMega168pのピン配置はこれ。VCC(AVCC)とGNDを接続する。
atmega168 pin assign


usbaspのケーブルの穴側から見たピン配置はこうなっている。
RESET,MISO,MOSI,SCKをAVRライターと接続する。VCCとGNDは回路のそれぞれと接続する。
R0015977



■Makefileを修正する
修正する箇所はDEVICE,CLOCK,PROGRAMMER,FUSESの4つ。
DEVICE     = atmega168p
CLOCK = 8000000
PROGRAMMER = -c usbasp
FUSES = -U hfuse:w:0b11011111:m -U lfuse:w:0b11100010:m
ATMega168の時はDEVICE = atmega168にする。

ここに完成品がある https://github.com/shokai/atmel-avrgcc-study/blob/master/28pin/led_blink/Makefile

fusebitの設定については橋本商会 » ATmega168のクロックを内蔵8Mhzに切り替えるに書いた。



■プログラムを書く
main.c を書く
#include <avr/io.h>
#include <util/delay.h>

#define TRUE 1
#define FALSE 0
#define NULL '\0'
#define sbi(BYTE,BIT) BYTE|=_BV(BIT)
#define cbi(BYTE,BIT) BYTE&=~_BV(BIT)

#define LED0_ON() sbi(PORTB, PB0)
#define LED0_OFF() cbi(PORTB, PB0)
#define LED1_ON() sbi(PORTD, PD7)
#define LED1_OFF() cbi(PORTD, PD7)
#define LED2_ON() sbi(PORTB, PB1)
#define LED2_OFF() cbi(PORTB, PB1)

void check_sw(void){
if(PINB&_BV(PB2)) LED2_ON();
else LED2_OFF();
}


int main(void)
{
DDRB = 0b00000011;
DDRD = 0b10000000;
LED2_ON();
for(;;){
LED0_ON();
LED1_OFF();
check_sw();
_delay_ms(1000);
LED0_OFF();
LED1_ON();
check_sw();
_delay_ms(1000);
}
return 0;
}

出力方向レジスタを指定する時は0bで2進数で書くと楽。
LED点滅の1秒(1000ミリ秒)のdelayはutil/delay.hを使った。



■コンパイルする
make
エラーがあるか確かめられる。



■ヒューズビットを書きこむ
Makefileで指定した、内蔵クロック8MHz駆動のfusebitを書きこむ。
make fuse
この操作は1回で良い。



■プログラムを書き込む
make flash
usbaspが書きこんでくれる。
avrdudeがSCKを使えていないというメッセージが出るが、書き込める。

usbaspが電源も供給してくれるので、回路にACアダプタや電池などの他の電源は接続してはならない。
usbaspの電源供給は基板上のjumper pinを抜けばOFFにできる。


これでAVRマイコンをMacで開発できる環境が整った。

2

emobileが月1100円安くなってPocketWifiがもらえるプランに契約するとインターネットが半分使えなくなる

(この記事の続きはここに書きました

sshが使えなくなって困っています。WWW以外をたくさん使う人は契約しない方が良い。


5月半ば、イーモバイルから電話がかかってきた。

  • 橋本さんは月4980円のプランで契約しているけど、通信料が多くないので3880円のプランに変更しませんか
  • おまけにPocketWifiを1円であげる

という内容。
何かデメリットは無いのか聞いたところ、
  • あと残り3ヶ月だった2年縛りは、2011年6月から24ヶ月にリセットされる
  • イーモバイル解約時の違約金は、残りの月数×900円
とのこと。

まあ損は無さそうなので契約した。


5月末にPocketWifiが届き、6月から3880円のプランになった。するとgithubにpush/pullできなくなっている。
3880円のプランはデータプランBという物で、試してみたらたくさん制限があった。
  • pingが通らない
  • ほとんどのportが閉じられている
  • port 22でsshが使えない
  • githubからpush/pullができない
  • もちろんwebsocketを使っているサイトは動かない
  • iPod Touchのpush通知が来ない

こんなアホな状態にされた、インターネットの半分以上が使えなくなった。
デメリットについては2年縛りの事しか言われなかったんだけどな・・・


で、イーモバイルカスタマーセンターに電話してみた。
こちらの要望は
  • 契約内容について説明不十分だったので、全てなかった事にして欲しい
  • PocketWifiは返却する
  • 2年縛りの延長は無し
  • プランを月4980円のに戻す


カスタマーセンターの加藤さんの主張はこれ。
  • プランを今から月4980円のものに戻せばいい
  • 契約をなかった事には出来ない
カスタマーセンターの人に謝られてもしょうがないけど、謝ったりはされなくて、口調は丁寧だけど妙に態度がでかかった。


「月4980円のプランに戻せば同じ」と言われてしまってちょっとキレそうになったんだけど、「説明不十分なまま契約させて、2年縛りが伸びたままのどこが”同じ”なの」と言い続けたら2,3日検討してからまた連絡してもらう事になった。
「同じじゃないですかぁ?」ってバカにしたような声で何回も言われたけど。同じじゃねえよ・・


イーモバイルのカスタマーセンターの知性の低さは詐欺に遭った|編集・デザイン会社の社長が書く今日のアメブロ等で事前に知っていたので覚悟していたけど、ちょっと頭悪すぎてびっくりしました。


来週の月曜の9時〜16時の間に電話で連絡してくれるらしい。

0

さくらのWordPressを2.9から3.1へアップデート

ずっと面倒でやってなかった、さくらのレンタルサーバーで動かしているwordpress2.9を3.1にアップデートを行った。
文字化けで死ぬかと思った!!!



このへんを見ながらやった。


が、文字化けした。状況としては、
  • PHPMyAdminでのimport時に、記事が全件読み込まれない
  • 文字化けしている
  • 新規作成したMySQL5.1はutf-8でデータベースを作成した
  • SQLファイルをnkfでutf-8に変換してからPHPMyAdminでimportすると全件読み込まれたが、依然文字化けしている
  • WordPress上でも、コントロールパネルのPHPMyAdmin上でも、どちらも文字化けしている
  • SQLファイルにexportした時点で18MBあった
  • bzipに圧縮してexportすると2MBぐらいになった。でもこれをimportさせてもダメ。
  • そもそもexportしたSQLファイルの文字コードをnkf -gで調べてもBINARYと表示される



文字化けの原因がよくわからない。
どうも最初にMySQL4.xをセットアップしたときに文字コードをutf8ではない物にしていたっぽい。そして書き出しの時に文字コードをutf8に指定しなかったかもしれない。どちらも思い当たるフシがある。


まあ文字化けの原因はどうでもいいので、今あるデータを加工して確実な方法でimportすればいいか、と思ってやってみたらうまくいった。


■解決方法
DBは削除して、utf8で新規作成する。PHPMyAdminは使わない。


exportしてきたshokai.sqlをMacでnkfでutf8にする
nkf -u shokai.sql > shokai_utf8.sql

ファイルの10行目あたりの
/*!40101 SET NAMES ujis */;

/*!40101 SET NAMES utf8 */;
に修正し、さくらレンタルサーバーに転送。


terminalでsshでさくらにログインして、
mysql shokai < shokai_utf8.sql -h mysql1234.db.sakura.ne.jp -u shokai -p
これで文字化けせずにいけた。

さくらにsshでログインできない人は、適当なUNIXマシンにMySQL5.1をインストールして、そこからmysqlコマンドを使えばimportできると思う。


※データベースの名前や、テーブル名(サーバー名と同じ)は適宜自分の環境に変更すること。

3

iPhone JavaScript Console作った

作った → https://github.com/shokai/iphone-js-console

iPhone用のJavaScript shellのようなもの。FirebugやChromeの開発パネルみたいな感じで使う。

chrome拡張やiPhoneシミュレータでiPhone用のwebページの動作は確認できるが、加速度センサやGeo Location APIなんかは実機で動かさないとデバッグできない。
しかしデバッグをしようにも、iPhone上で大量のalertを出すと気が狂ってしまう。iPhoneで実行中のwebページ上の任意のオブジェクトの中身を、Macから覗いたり値を書き換えたり関数を実行したりするツールが必要だったので作った。

なお、Androidのブラウザにはwebsocketが無いのでこのツールは動かない。Androidではlogcatで

adb logcat | grep "^./browser" --color=auto
すればconsole.log、console.errorの出力は見れるので、それで何とか我慢している。



■セットアップ
MacとiPhoneを用意する。MacとiPhoneは同じ無線LANの下に接続して、互いに通信できるようにしておく。

github.com/shokai/iphone-js-consoleからcloneしてくる。

iphone-js-console.jsをhtmlに読み込ませる。JsConsole.startで自分のMacに接続させるようにする。
<script src='iphone-js-console.js' type='text/javascript' />
<script type='text/javascript'>
JsConsole.start('ws://192.168.1.38:8088'); // Addr of Console Server
</script>
(あらかじめconsoleを起動するMacのIPアドレスは調べておこう)


Macで、iphone-js-consoleを起動する
./iphone-js-console

iphone-js-consoleの起動時に、rubygemsが足りないという警告がでたら足りないgemをインストールする。
gem install eventmachine em-websocket
多分これで足りる。
あとreadlineを使っているけど、Macの最初から入っているreadlineは腐ってた気がするので、brewかportsで入れるといい。(わからなかったら飛ばしても多分良い)



■使う
Macのiphone-js-consoleで
alert(document.title)
と打つと、


このようにiPhoneのSafari上でJavaScriptが実行される。


また、iPhoneのSafariの変数を参照することもできる。
> window.navigator.appVersion
<1> "5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5"


中身が複雑なオブジェクトは整形されて表示される。
> location
<1>
{"href"=>"http://192.168.1.38:8080/debug-sample.html",
"hash"=>"",
"port"=>"8080",
"protocol"=>"http:",
"origin"=>"http://192.168.1.38:8080",
"pathname"=>"/debug-sample.html",
"hostname"=>"192.168.1.38",
"host"=>"192.168.1.38:8080",
"search"=>""}


もちろん、エラーも出力される。
> homu
<1> "error : Can't find variable: homu"
> 1+2
<1> 3
> 1+
<1> "error : Parse error"


iPhoneのJSで、あらかじめ
console.log(foo);
とか書いておけばもちろんMacのiphone-js-consoleにfooの値が表示される。


一度入力したコマンドは、キーボード上下で履歴を呼び出したりできる。
大変便利ですね。




■技術的なこと
iPhoneとiphone-js-consoleの接続にはWebSocketを使っている。EventMachine::WebSocketが便利だった。

iphone-js-consoleからiphoneへ送信された文字列は、そのままiPhone上でevalで実行させている。
iphoneからiphone-js-consoleへのオブジェクトの送信は、iPhone上でJSON.stringifyでシリアライズして送信して、iphone-js-consoleでparseして適当に整形して表示している。

別に難しいことはしていない。

0

PhoneGap NFC Plugin作った

PhoneGapでAndroidのNFCを使えるpluginを作った。



JavaScriptから簡単にNFCタグのIDが読める。
<script src='./phonegap.nfc.js' type='text/javascript' />
document.addEventListener('deviceready', function(){
window.plugins.nfc.id(
function(tag){
var id = tag.id; // get Tag ID;
},
function(e){
log(e);
});
}, true);


インストール方法はgithubに書いた。サンプルプロジェクトもある。
普通のPhoneGap pluginと同じく、phonegap.nfc.jsとNfcPlugin.javaを所定の場所に置くのだけど、NFCを使うためにguava librariesとAndroidManifest.xmlの修正も必要。

とりあえず、NFCでタグのIDを読むだけしか機能は無い。もちろん他にも色々データは取れるんだけど、どこまでwrapしたらいいのかよくわからないのと俺がIDしか使う予定が無いので、とりあえずIDだけにしておいた。(要望あれば追加する)




PhoneGap pluginの作り方は、phonegap / PhoneGap Pluginsが参考になった。JavaScriptからJavaのコードを呼びだす方法が書かれている。


既に公開されているプラグインがいくつかあって、それも参考になった。