番外編: IchigoJamのアップデート
IchigoJamのXTAL外付けに対応したファームウェア0.8.7がリリースされた。さらに0.8.8というバージョンもあるようだが、どこに掲載されているか見つからないので、0.8.7でアップデートすることにする。
IchigoJam.netにもFacebookの公開グループ・ページにも具体的なアップデート方法が記載されていないので、Google検索し、青mbedを使った方法で挑戦してみることにした。IchigoJamにはMCUとしてLPC1114FN28が搭載されているので、この内蔵フラッシュに新ファームを書き込む作業になる。
■用意したもの:
・青mbed(およびオンライン・コンパイラの実行環境。当方はWindows PCを使用)
・アップデート対象のIchigoJam完成品
・水晶発振子12MHz(表面実装型でなく、リード線の出ているもの)1個
・ika_shouyu_poppoyaki(LPC1114FN28への書き込みプログラム)
・IchigoJamファームウェア0.8.7(Facebookの公開グループIchigoJam-Fanのファイル欄より)
・TeraTerm(ターミナル・ソフト。ika_shouyu_poppoyaki実行時のモニタ用)
・ブレッドボード、配線材
■手順:
1.ika_shouyu_poppoyakiのページ(
http://developer.mbed.org/users/okano/code/ika_shouyu_poppoyaki/ )掲載の図のとおりに接続。IchigoJamは完成品のためMCU以外にも部品が搭載・接続されているが、気にせず図のとおりに接続。
2.ika_shouyu_poppoyakiのプログラムをmbedの自分のオンライン・コンパイラへImportし、Compileを実行。binファイルのダウンロード後、LED1~4が点滅を始める。
3.mbedの中に、つまりmbedのルート・ディレクトリに、Ichigojam0.8.7のファイルをコピー。以下の注意点メモを参照。
4.青mbedのリセット・スイッチを押すとika_shouyu_poppoyakiのプログラムが実行される。TeraTermに状況が表示される。
5.成功すると青mbedのLED1~4が順に点灯する。TeraTerm上でも成功を確認できる。
■動作確認:
IchigoJamにキーボートやTVを接続し、IchigoJam上のピン・ソケットでIchigoJamと@taisukefと書かれたピンに水晶発振子を挿入。電源を投入してTV上に表示されるファームのバージョンが0.8.7であることを確認。
■結果:
静止状態での画面のチラつきは無くなった。キーボードを叩いた時の画面ノイズは相変わらずだが、これは原因が異なるはず。
■注意点メモ:
・0.8.7をダウンロードしzip解凍するとichigojam.binというのとichigojam-xtal.binというのができる(他にも.hexとかもできる)。このうち-xtalの方を使う。他方は外付け水晶発振子を使わない場合のものだろう。
・ika_shouyu_poppoyakiでLPC1114FN28書き込むプログラムはbinという名前のファイルである必要がある。ファイル名だけで、拡張子は不要だった(最初.binとしていたら書き込めなかったので、拡張子を消したら成功した)。
■おまけ:
いきなりIchigoJamに書き込むのがイヤだった+オリジナルのファームも残しておこうと思い、LPC1114FN28を別途購入しこれに書き込んで載せ替えることを計画。書き込み直前になってIchigoJamを見るとMCUは基板に半田付けされていて取り外せない。あーあ、と思ったが、考えてみるとIchigoJamの本体とファームが手に入ったのだから、これを使えばブレッドボードでも基板でもIchigoJamを自作できる。これはこれで良しとしよう。
番外編: IchigoJam使用メモ
IchigoJamを使ってみて発見したこと、メモなど。
使用環境: IchigoJam(0.8.5), PS/2英語フルキーボード, 30インチTV
・変数は1文字のみ。大文字も小文字も使える。
・数値は整数のみ。範囲は+32,767 ~ -32,768
・4ピンのロジック出力への命令 OUT Aは、Aに0..15を入れる。これが2進数に変換され、各OUTピンの状態を決める。A=3なら0b0011なので、OUT1/OUT2がHigh(3.3V), OUT3/OUT4がLow(0V)になる。
・INKEY()を試したが、想定したように動作しなかった。
・動作確認しなかった命令は、BTN(), IN(), VPEEK, ビット操作系すべて, SLEEP。
・キーボードは日本語キーボードが想定されている様子。英語キーボードは配列が異なるので面倒。
・画面の文字の揺れは使っているうちにあまり気にならなくなってきた。ただし、プログラムをRUNさせている最中も揺れたり一部乱れたりするので、揺れの原因はクロックだけの問題ではなく、ビデオ出力をMCUからの信号で作ってるためかもしれない。
・INKEY()のように、情報が足りない感は否めない。命令一覧(リファレンスとして用意されているもの)も、内容の整理不足で少し分かりにくい感じ。
・情報不足の部分については、製作者の方や皆さんが公開しているプログラム例を研究するしかないか。
・上記の課題はあるものの、つないですぐにプログラムが書ける、簡単に修正できてどんどん試せる点は「プログラミング最初の一歩」用としては素晴らしいと感じた。
番外編: IchigoJamを入手
どういう経緯だったか忘れてしまったが、IchigoJamなるBasic専用マイコンを知り、スイッチサイエンスから購入。(同時にmbed application boardも購入)。
アナログ・ビデオ入力(コンポジット・ビデオ)とPS/2キーボード、電源供給用のマイクロUSBがあればOKとのことで、早速電源投入。
TV画面にOKの文字が出ているのでLED 1と入力すると、ボード上のLEDが光る。続いてLED 0と入力するとLEDが消灯。行番号とLED 1, WAIT 60, LED 0, WAIT 60, GOTO 10と打ち込み、RUNと入力するとLEDがON/OFFを繰り返すLチカが完成。この間1分くらい。
このくらい簡単だと子供にも使いやすいと感じる。
ただし。。。
・TV画面に表示が左右に揺れ、見にくい。動作クロックに水晶を使っていないため、水平同期のジッタが大きいものと推定。
・サポートが貧弱。購入のバージョンは0.8.5だが、最新は0.8.6らしい。どうやってアップデートするのかいろいろと探したが、メーカー(供給)側からのちゃんとした情報が無い。facebookの公開グループに登録するのが正解のようだが、これは躊躇する。
教育用途としてのコンセプトは良いし賛同できるので、今後の成長を見守りたい、という感じ。
printf()によるデバッグの準備
このところ、インターフェース誌とトラ技(1)が立て続けにmbedを特集した。その記事を眺めていると、デバッグはprintf()だけとの説明が目に付く。オンライン開発環境は良いが、従来のデバッガが使えない、そこでデバッガを使うには、と記事は続くのだが、逆に言えばオンラインでもprintf()は使えるということらしい。printf()はC言語の解説書のHello World(2)に必ず登場する有名な標準関数(3)の一つ。これをmbedのオンライン開発環境でも使えれば、デバッグ以外にもいろいろ便利そう。さらにキーボード入力(PCのキーボードからの入力)が使えれば、さらにベターである。
ということで、調べてみると、
・Windowsではドライバのインストールが必要
・PCで表示するには別のソフト(ターミナル・ソフトと呼ばれるもの)が必要
と判った。
Windows用ドライバはこちらのページを見ながらインストール。途中でMicrsoftからの警告が出るが気にせず「続行」を選択。インストールを始めるにあたり、他のプログラムを落とすように注意書きがあるので、それに従う。
https://mbed.org/users/okini3939/notebook/mbed256_debug/
https://mbed.org/users/okano/notebook/personal_memo--usb-serial_IO/
ターミナル・ソフトはTera Termを選択。上記ページの説明で使われているので悩まずに済む。実際にはTera Term Proのポータブル版を選択した。
動作確認のHello Worldはこちらのページのもので行った。PCへの表示だけでなく、入力もできる。素晴らしい。
https://mbed.org/users/okini3939/notebook/Serial_jp/
(1) トランジスタ技術 2014年10月号 特集「見参!お膳立てマイコンmbed」
(2) 動作確認や最初の練習用として示されているプログラム。Hello World!と画面に表示するものが一般的。
(3) Cであらかじめ用意されている関数。
失敗から学ぶ(その後)
前回のエントリー「失敗から学ぶ」のその後を書いていなかったので、簡単にメモ。
なぜうまく動かなかったのかの追求はせず、プログラムを関数を使って書き直した。それでうまく動いた!と思いきや、うまく動かない場合がある。内容は24時制の時分表示の各桁をひとつずつ切り出すところ。ここを剰余演算子(%)を使って書いていた。
いろいろと悩んだ挙句、同じプログラムを別のオフライン環境(1)にコピーし、printf()で各段階の値を表示されるデバッグ手法を使ったところ、剰余が正しく計算されていないと判明。思い当たってのは24時制の午前は時間が0で始まる。Cでは0で始まる数値は8進数を解釈されるので、例えば0700は7*8^2と解釈されてしまう、と判った。
この修正はまだ実施していないが、今回のエラーについてはこの理解で正しいと思われる。なお、時分を切り出す方法はもっとスマートな方法がありそうな気がするので、Cの勉強が進めば改善できるかもしれない。
学んだこと:
・Cでは、0で始まる数値は8進数と解釈される。
(1) Visual Windows for BC++
失敗から学ぶ
昨日青mbedでいろいろと試していた。青mbedに圧電ブザーを付けただけの簡単な構成で、プログラムを書いて遊んでいた。
コンパイルすると、エラーが出るわ出るわ。なぜこのエラーが出るのか、例によってわからない(=エラー表示は原因の特定にほぼ役に立たない)。
でも、たくさんエラーを出して、そのたびに頭を悩ませて修正しているうちに、ちきりんさん(@insideCHIKIRIN)のツイートを思い出した。
「失敗するより効率的な学びの方法って何かあるんだっけ?」(2014/6/29のツイートから)
まさに、この通りの経験をしているなぁ、と。
・自分で身に付いていないところでつまづく。調べる。修正する。
を繰り返している。
ソフトで、しかも手元でバンバン試せるので、修正のサイクルは速く回る(もちろん修正の実速度は本人の技量に依存するが)。これがプロトタイピングのメリットなんだと実感。
だがしかし、「動くはずなんだけどなー」という所で昨夜は終了。言語の構造をちゃんと使って、もう少し整理して書いた方がいいみたいだ。ということで、C言語の参考書を読み直してみる。
Nucleo STM32F401を入手
インターフェース誌の記事(1)でリアルタイム信号処理に向くとの説明を読んだ矢先、アキバに行く機会があった(2)ので、秋月でNucleo STM32F401を購入。1,500円。すぐに使う予定はないが、アキバに来る機会も多くないからと、この際購入。
家に帰って早速Hello Worldしてみると、青mbedと少し様子が違う。
・まず、ファームウェアのアップデートが推奨されている(3)ので、これを実施。最初にドライバが必要とのことで、ダウンロードしてインストールするが、2個のうち1個が失敗。(4)を参考にパッチをあてたら2個目のドライバもインストールできた。その後、アップデートを実施。これはすんなり成功。
・Hello Worldを試す。ターゲット(Nucleo STM32F401)はメモリとして認識されるが、コンパイルしたbinファイルを書き込んでも、binファイルが見えない。書き込むとすぐさま別の場所に移動されるのか?書いたものが消えて見えないのは気持ち悪い。 青mbedでは書き込んだbinファイルが見えるし、明示的に消さない限りそこに残っている。
・Nucleo STM32F401をPCにつなぐと、USBメモリとして認識される他に、STMicro STLink dongleとしても認識されている。よく覚えていないけど、これ用のドライバを入れさせられらような気がする。
・ボード上に未実装のXtalがある。記事(1)にも書かれていたが、購入時にはすっかり忘れていた。この点は次回の記事で説明があるらしい。「初期のボードには実装されていない」ようなので、ちょっと損した感じ。
・よく見ると、パッケージの裏にあれこれ説明書きがある。ジャンパ位置を確認するとか、なんとか。Arduinoシールド向けのピン・ソケットも実装されている。ボード・サイズは青mbedよりも大きい。
(1) インターフェース誌 2014年10月号 「激安!1500円mbed Nucleoで作る本格ディジタル信号処理マシン(第1回)」
(2) mbedイベントに行けなくなったのでアキバへ寄り道。