2019年11月25日月曜日

IchigoBoy Pocket Kit 98%をつくってみた

従来のIchigoBoy Pockeはチップ部品を多用していたので主に完成品で提供していました。

名前は IchigoBoyPocket Kit98%

CPU以外をリード部品に置き換えてみました。
コネクタとスイッチの位置についてはできるだけ同じにしています。

電源のUSBコネクタは、リード部品といえるかどうか微妙です。(^^;;
EEPROMもDIPが使えたのはラッキ―でした。面実装タイプも使えます。
全部で約50個のパーツが載りますがCPUが唯一半田付けしてあります。つまり2%だけできているので98%キットと言うわけです。
もちろんIchigoJamBasicは書き込み済みです。

スライドスイッチは脚付きタイプと従来品の両方が使えます。
OUT1~6を引き出せるスルーホールを大きくしたので工作に使いやすくなったと思います。

PCとつないでプログラムやファームウエアのアップデートできます。(ソケット付き)

基板の写真 大きさはIchigoBoyより少し小さいです。


表 緑色はコンバータモジュールです。

裏 電池ホルダは両面テープで固定します。

回路図

回路図

PDF版はこちらから。

作り方について 

部品が小さめで、50点と多めなので中級者のかた以上にお勧めします。
配置が密で両面実装していますので、順番によっては難易度が上がります。
小さな部品から付ければ問題はないはずです。

添付の説明書はここからご覧ください。これがすべてです。
22KΩ(赤赤橙金)と2.2KΩ(赤赤赤金)がとてもよく似ているので間違えないようにしてください。

では、ゆっくりと、半田付けをご堪能ください。

LINK他

IchigoJamはjig.jpの登録商標です。
詳しくはこちら


2019年11月16日土曜日

IchigoJamのI/Oを増やしてみる

IchigoJamは28ピンのLSIを使っているので、IO端子数が結構厳しいです。
そこで、これを増やす方法を考えました。

端子を増やすにはエキスパンダを使う。

エキスパンダって白黒のかわゆい希少動物ではなく、Expandするヤツです。
ふと目についたこれ。

タイトルは、「キャラクタLCDをシリアル接続するアダプタ」です。
キャラクタLCDは最低でも7ピン必要なのですが、マイコンで7本のピンが残っていないときシリアル接続するための基板です。LCD用ですが、中を見ると「PCF8574」が使われていてこれを調べると「汎用IOエキスパンダ」でした。つまり、汎用品を使ってLCD基板を作っています。
ならば、汎用エキスパンダにも使えるはずということで、試してみました。

IchigoBoyPocketにつないでいます。
4ピン部分をROMソケットにつなぎます。IchigoJamの配置とはSDAとSCKが逆なのでそのままでは刺せません。私は配線に変えてつなぎました。
16ピン側がLCDに行く線ですが、これのDB7~DB4,E,R/W,RSの7本が使えます。

ポイントは、

  • READするポートは1をWRITEしておく事
  • I2Cアドレスが2種類あること(#27、#3FでICの種類で変わります。)
  • IchigoJamのROMソケットとは信号が逆順だった。

アドレスが2種類あるので注意が必要です。各々7アドレス追加でき8個を同時につなぐことができます。
単純にここを1バイトI2CWすれば書き込むことができるし、1バイトREADすれば読み出せます。1ビットごとではなく8ビット同時です。
まずは読み出しサンプルプログラムです。行60で#FFをOUTしておきます。
10 'IO Expander
50 POKE#700,255
60 R = I2CW(#3F,#700,1)
100 for i = 0 to 255
110 poke#700, i
120 R = I2CR(#3f,#700,1)
125 ?BIN$(PEEK(#700))
130 NEXT
140 GOTO 100

次は書き込みサンプルプログラムです。

10 'IO Expander OUT
100 for i = 0 to 255
110 poke#700, i
120 R = I2CW(#3f,#700,1)
125 ?I
130 NEXT
140 GOTO 100
ここまでは、簡単ですね。
手元のアダプタでは次のような対応でした。
Jam    アダプタ
Bit7             DB7
Bit6             DB6
Bit5             DB5
Bit4             DB4
Bit3            なし。読むとゼロです。
Bit2    E
Bit1            R/W
Bit0            RS
注:読むときはOUT=1にすること。
注:アドレスは#27と#3Fがあるので動かないときは両方試すとよいかも。

これを使って電子工作してみましょう。

 追加でスイッチをつないだり、モーターをつないだりできますね。
電子工作するときに便利そうです。






2019年9月8日日曜日

IchigoJamで温度を測る

IchigoJamに温度計をつないでみます。

I2Cタイプを使います。理由はこんなところ


  1. アナログだとノイズもあり精度が出しにくい
  2. SPIだと貴重なポートを消費する。

IC品番

ADT7410
秋月さんで購入しました。参考LINKかこちら
ディフォルトなので13ビットで変換しているはずです。

プログラム例



1 @ARUN'TEMP
50 SWITCH1
100 POKE#700,0,0
110 R=I2CW(#48,#700,1)
115 ?R;" ";
120 R=I2CR(#48,#700,2)
125 ?R;" ";
130 T=PEEK(#700)*256+PEEK(#701)
140 PRINT T/128;".";(T+6)%128*10/128;" ";T
150 WAIT 30
160 GOTO 100

読み取りを128で割ると温度になりますが、IchigoJamでは整数で扱うので小数点以下の表示するためにPRINTが少々複雑になっています。Tが読み取ったデータです。

==追記==
このセンサーは、アドレス設定ができて最大4個を同じ線に接続できます。
とりあえず、A0=A1=Hの場合を追加してみました。

1 @ARUN'TEMP
50 SWITCH1
100 POKE#700,0,0
110 ?I2CW(#48,#700,1);
115 ?I2CR(#48,#702,2);
120 ?I2CW(#4B,#700,1);
125 ?I2CR(#4B,#704,2);" ";
130 T=PEEK(#702)<<8+PEEK(#703):U=PEEK(#704)<<8+PEEK(#705)
135 U=[1]
140 PRINT T/128;".";(T+6)%128*10/128;" ";T;" ";U/128;".";(U+6)%128*10/128;" ";U
150 WAIT 30
160 GOTO 100

--さらに追記--

MixJuiceをつないで、温度をクラウドにUPしてみました。

2 CLS:?"Ambient":UART1
3 'MJ PCT application/json
4 'MJ POST START ambidata.io/api/v2/channels/チャンネルIDを書く/data
5 '{"writeKey":"ライトキーを書く","d1":"#"}
6 'MJ POST END
100 'MAIN
110 P=#C1A
120 gosub1000:A=T
130 gosub600:gosub600:gosub600:gosub600
140 wait120
150 goto 100
600 'TX
610 ifpeek(p)<>asc("'")letP,P+1:goto610
620 P=P+1:ifpeek(P)=asc("#")?A;".";(A+6)%128*10/128;:goto620
630 ifpeek(P)<>0?chr$(peek(P));:goto620
640 ?:return
1000 R=I2CW(#4B,#700,1):R=I2CR(#4B,#702,2)
1010 T=PEEK(#702)<<8+PEEK(#703)
1020 T=T/128
1030 RETURN
----------------

回路

回路図はありませんが、A0、A1をGNDにつないでください。あとは電源とGNDとSCLとSDAをROMカセット接続するソケットにつなげばOKです。
秋月さんで購入するなら基板付きもあるので、そちらが便利かもしれません。


結果

実行するとこんな感じです。最初の0,0はI2C関数の戻り値です。最後の大きな数字はセンサーの読み出し値です。

2019年7月11日木曜日

RaspberryPi Zero を モバイルバッテリーで使う件

消費電力の少ないラズパイをバッテリーで使うとして、どれくらいの大きさのモバイルバッテリーが必要になるかざっくり計算してみました。

ラズパイを動かすバッテリーの大きさはどれくらい必要か?


まず知りたいのは、どれくらいの電気を喰うのか?ですが、検索してみると実験されている報告がありました。感謝!
https://www.usagi1975.com/052520180823/

ざっくり200mAで動くらしいですね。(詳しくは引用LINK先をご覧ください。)
5Vで使っていて、電力は5Vx200mA = 1Wattです。

電力量は?

1時間で使うエネルギーは1Wattx1時間=1Wh。
ここまでは簡単ですね。

モバイルバッテリーの容量は?

モバイルバッテリーの容量は、通販サイトとかみるとmAhですね。
これは、例えば1時間で放電させるときこれだけの電流が流せるって目安です。ここで注意してほしいのは、これが目安ってところ。実際には取り出せるmAhは流す電流で変わるはずです。10倍の電流を流すと1/10時間=6分になるかというとそれほどはモタナイはずです。それは、電池が化学反応で電気をだすためで、一度に流す電流によって取り出せる総電流は変わります。
だから目安です。

乾電池は、間欠(つまり大電流を流して、休ませてを繰り返す)使い方が一番たくさんエネルギーが取り出せると聞いたことがあります。
乾電池でも作り方で、大電力を短期間に取り出すのが得意なタイプと、少しづつ長く使うのが得意なものがあります。後のタイプは、時計向きですね。

閑話休題(それはさておき)

でも、mAhって電流x時間で電力量ではないですねえ。
そういえば、充電できるニッケル水素電池も2000mAhとかが容量の表示ですね。

電池の電力?

電池の容量が電流x時間なので、これに電圧を掛けてやれば、電圧x電流x時間=電力量を見積もることができます。

先ほど例にあげた2000mAhのニッケル水素電池なら電圧が0.8V~1.2Vくらいなので中をとって1V平均なら1Vx2000mAh=2Whになります。電圧が途中で変わるのでまあ目安程度です。
ラズパイは1Vでは動きませんから、電圧を変換する必要がありこの時10~20%くらいの電力が失われます。(多くは熱になってしまいます)
最終的に使えるのは
  2Whx80%=1.6Whになります。

ラズパイZeroWが1Wattでしたから、
    1.6Wh÷1W=1.6時間 使うことができる計算です。

モバイルバッテリーの場合

モバイルバッテリーの場合はどうなるかですが、中の電池はたいていリチウムポリマーでしょう。それなら電圧は4Vくらいだと思います。(目安ね)

すると、使える電力はこんな感じで計算できます。

   電流容量x4Vx80%

例えば1000mAhの場合にはこうなります。

    1000mAh x 4V x 0.8 = 3.2 Wh

ラズパイが1Wでしたから動かせる時間の見積もりはこうなります。

    3.2Wh ÷ 1W = 3.2h

時間を長くしたいときは電流容量を大きくすればOKです。
例えば2倍の2000mAhのモバイルバッテリーなら時間も2倍の6.4時間の動作が期待できますね。

ここで、注意が必要なのは、これが新しいときの話だということです。
使うと容量は減っていきます。大体半分で寿命という目安なので、使いたい時間から計算した容量の2倍くらいを用意すればよいと思います。

また、ラズパイの電力の1Wも平均です。コンピュータなので細かく増えたり減ったりしていて、つまり瞬間的にはたくさん流れてしばらく少なくてというのを平均すると1Wということなのです。モバイルバッテリーも減ってくるとたくさん流れる瞬間に電気が足りなくなって装置として止まってしまうこともあります。このところからも大き目のバッテリが必要になります。

例えば5000mAhのモバイルバッテリーなら

5000mAh x 4V x 0.8 ÷1W ÷ 2=8時間

結構長く動きますね。
もちろん、Zeroの他にも何か動かすのであればもっと大容量のバッテリーが必要ですが、使う電力(電流x電圧)を見積もれば、同様の計算で必要な容量が計算できます。




2019年6月9日日曜日

IchigoJamで効果音

IchigoJamでゲームを作ったり電子工作をするときに音がでるといいですよね。
BASICにBEEPや音階をだす機能はあるのですが、サイレンや光線銃的な音が出せたらよいなと実験をしてみました。

IchigoJamで効果音チップを動かしてみる件


使ったもの

  • KD9561 CK9561


とりあえず、通販で買えるこれを試しました。情報はネット検索でたくさん見つかりますので基本情報には事欠きません。ただそれだけなら、この記事はあまり意味がありません。 

Webで見つけた使い方

どの記事も一様に次のように書いてあります。

  • 220KΩ前後の抵抗器をつなぐ(幅はひろいようです)
  • 電源に10uFのコンデンサをいれて+とーに電源をつなぐ。
  • 出力をトランジスタのBASEにつなぐ。
  • トランジスタのコレクタを圧電ブザーにつないで、ブザーの反対側は+につなぐ。
  • K1とK2をーや+につなぐと合計4種類の音がでる。
  • この使い方だと音は酷い。まともなアンプとスピーカにつなぐとかなりましになる。

ちょっと考えました。


  1. トランジスタのBASEに直結するということは、抵抗が内蔵されているか電流出力になっている。しかも、電流は少なくとも数mAはでてくるはず。
  2. IchigoJamで使うのに、音が鳴りっぱなしは使いにくい。

そこで、実験です。

トランジスタを付けずに、8Ωの普通のスピーカを直結してみたらまあまあの音で(オモチャには十分な音質)音量も屋内用なら十分な音量で鳴るではありませんか。これはラッキーです。

次はどうやって音をとめるかですが、元々の使い方では、ボタンを押すと電源がつながるようになっていたはずです。電圧も3.3vでちゃんと鳴りますし、実験では電圧を下げても音量が下がるだけで鳴っています。 それならばと、IchigoJamのOUT1から電源をとるようにつないでみました。するとOUT1,1[enter]と打ち込むと、ちゃんと鳴るんですねえ。

ここまで用意して、いつも電子工作をしている子供たちに半田付けして鳴らしてもらいました。 後は放置して、様子見です。

これを作った子供たちは、その後どうしたか。

その後、OUT2にK2をつないでおいてOUT2,1とOUT2.0でサイレンの種類が変わるようにだけ教えたのですが、しばらくすると、無いはずの色々な音を出し始めた子がいました。GOTO LOOPで1,0を繰り返しWAITでタイミングを調整すると混ざってきていろんな音を出して気に入った音を探していました。 こんな発見をしてくれるなんて、やっぱり子供っていいですねえ。

ちなみに 今日はやっていませんが、K1は+/Open/-につないで3種の音が出る仕様なのでOUT の0,1、-1で音が変えられるはずです。

作ってもらったのは、これです。



 黒ー>GND
 白ー>OUT2
 赤ー>OUT1 (LEDにつなぐと、LED1で音が鳴ります。)

これで、OUT1,1 で音がでて、 OUT1,0で止まります。
OUT2,0 OUT2,1 で音が変わります。

IchigoJamで作るイライラ棒で失敗したらLEDが点くようにプログラムしたものがあったので、赤(+)をソケットのLEDに挿し変えてみたところ、プログラム変更なしで、音の出るイライラ棒ゲームにアップグレードできました。

問題ないか一応の確認

10uFのコンデンサや間接的に8ΩのスピーカなぞをOUTにつないでしまって大丈夫か気になるところですよね。
まず、音を鳴らしているときのOUT1端子の電圧を測りました。

  電源電圧3.3V  OUT1の端子電圧≒2.9V 約0.4V下がっています。

LPC111xの仕様書をNXPサイトで探してきてみたところ OUTをGNDにつないで流れる最大の電流値=50mAとあります。注釈の[15]がついていて、「Limitを値を越えないかぎり容認される」とあります。別のところでLimitを探しますと電源電流値で100mA とありますので、1ピンだけならOUTから目いっぱい電流をとっても許されるようです。

また、出力電流特性あたりも VDD-0.4Vを基準にかいてあります。ということは0.4Vさがるような使い方というのはそれほど無茶ということもなさそうです。

ということで、これだけなら(他にも何かつなぐとどうなるかわかりませんが)すぐに壊れてしまうようなことはなさそうです。

スピーカ直結で作るのも簡単。部品集めも楽。音質も問題なし。で言うことありません。

屋外用とか、音量を上げたいときはアンプにつないでください。

以下参考ですが、6ピンのピンヘッダをパターンの反対側から半田付けすれば、ブレッドボードに挿すこともできます。+が繋げられないように見えますが、調べてみると+と名前のない端のピンは中でつながっていました。つまり+と書いてある端子でなく6番目のピンをつかえば、無理なく6ピンでブレッドボードで配線できるようです。

ただし、以上は私の入手したものの場合ですので、各自確認の上でご使用ください。
私は5台ほど組み立ててすべて同じように動くことを確認できています。

キットにしてみた。

ご要望にお応えしてキットにしました。内容の保証はできませんが、試してみたい方々用に説明書を置いておきます。自己責任でお楽しみください。


2019年3月31日日曜日

IchigoBoy 2、IchigoBoy Pocket2

IchigoBoyを更新します。

皆さんからご意見頂きまして改定することにしました。

IchigoBoy2

抵抗器の配置で違う種類が混ざっていたので並べなおしました。
抵抗の足の間隔を少し広げて付けやすくしました。
モニターコネクタが当たっていたので切欠きました。
LCDの位置を左右中央に移動しました。
電池コネクタを少し移動しています。
OUT1~6に配線できるパッドを追加しました。キースイッチと切り替えでうまく使えば利用できます。
コマンドが裏側に書いてありますが、電池ボックスで隠れにくいように少し移動しました。
バックライトにジャンパー線を付けていましたが、パターンを追加してジャンパーの半田付けを不要にしました。暗く設定するときはパターンを削ればOKです。
     等々。

IchigoBoy Pocket2

ROMを追加しました。(OFFできるので、外付けROMも使えます。)
Bボタンが押しにくかったので位置を調整しました。
電源スイッチに足つきの壊れにくいものも使えるようにしました。従来タイプも使えます。
基板の中央になりましたが、OUT1~6の端子を出しました。キースイッチと共用ですが使えます。


補足

PocketはROMを追加しました。スイッチの間に置きましたのでちょっと目立ちます。
OUT1~6を配線を半田付けして引き出せるように追加ポートを用意しました。
INはLCDに使っているので、やめておきました。LCDのあるコントローラなどに利用できるとおもいます。
OUT1~6はBoy的にはINに設定して使いますのでそのままであればボタンの状態が追加ポートでわかります。ここで、OUTに変えるとスイッチの状態ではなくOUTした状態に変わります。注意点は、INで使うときはスイッチの状態(通常0で押すと3.3V)になることと、抵抗が入っているので取りだせる電流に制限があることです。

回路は基本的には変わっていませんので掲載は省略します。

回路図追記(Pocket ROM付き版、OUTPORTはIchigoBoy2と同じです。)
ダウンロードはこちら


告知

メイカーフェア京都2019にエントリーしましたので、これにもっていく予定です。



メイカーフェア京都2019に出展しました。お買い上げいただいた皆様ありがとうございました。





Ichigojam用モニターTVの中の基板

IchigoJamで使っているダッシュボードモニタの故障品が届きました。
修理しようとして溜まっています。
とりあえず写真だけ撮ってあったたけで修理は進んでいないのですがこれはこれで面白いので公開しておきます。







電解コンデンサを交換したら動きましたが、、
ケースに入りません。(^^;;;

中身は色々ありますね。
故障個所ですが、ざっと見たところでは電解コンデンサの容量抜けですねえ。電解コンデンサのてっぺんは平らなのが初期状態ですがよく見ると膨らんできています。典型的な不良モードです。コンデンサとしては機能しなくなってると考えられます。

となれば修理作業は単純で、コンデンサを交換すればOKです。

ただ、故障したのは面実装用の小さな部品を使っていて熱がコモッタというのが根本にある可能性があります。それだと同じ部品を持ってきて交換してもまた壊れます。
外形が大きなコンデンサに変えればよいですが、それだとケースに収まらなくなります。

1台はフェライトコアが割れていました。割れたかけらが残っていれば瞬間接着剤で貼り付ければ治りますが、なくしてしまいました。

面実装コンデンサの交換はそれなりに難しいというのもあって放置ですが、近いうちに直したい。です。

LPC1114 にプログラムを書く

IchigoJamに使われているLPC1114は、NXPから無償のコンパイラが入手できます。
書き込みTOOLもFlashMagicがNXP社のサイトからダウンロードできます。
ところが、コンパイラがつくるファイルはELFフォーマットでそのままではFlashMagicでは書き込みできません。Linuxだと変換TOOLがあるのですが、Windowsにはないようです。
LPCExpressoを買えば、ELFファイルを書き込めるので問題はないのですが、FlashMagicでも書けるようにしてみたい。

ELFをBINやHEXファイルにするTOOLを作ろうというのが今回のテーマです。

NXP社のコンパイラ

まずは、LXP11xx用のTOOLとExampleをダウンロードしてきます。
無償でも256Kbまでコンパイルできるようで、問題なく使えます。LPC1114には32KBしかメモリがないので余裕です。

さて、とりあえず以前にも使ったことのあるBlinkyをReleaseでコンパイルしました。
コンパイルに先立って参照するライブラリをコンパイルしておかないとエラーになります。

プロジェクトのReleaseフォルダのなかに「LPCX1114_cmsis2_blinky.axf」というのができていました。拡張子が予想とちがいますが、これがELFファイルのようです。

次に中を見たいのでバイナリエディタを探してもいいのですが、後で変換する予定なので中をみるツールを作ることにします。

ファイルをバイナリでひらくプログラム

Visual Studio2013

C#のデスクトップアプリを作ることにします。
Form1にボタンとテキストボックスを貼って、テキストボックスのマルチライン=TrueにしてFrom1に次のコードを書きます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace ArmElfHandle
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        
        byte[] elf;

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            if(ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {

                FileStream fs = new FileStream(ofd.FileName, FileMode.Open);

                elf = new byte[fs.Length];

                fs.Read(elf, 0, elf.Length);

                fs.Dispose();

                StringBuilder sb = new StringBuilder();

                for(int i=0; i<elf.Length; i++)
                {
                    sb.Append(elf[i].ToString("x2"));
                    if((i%16)==7)
                    {
                        sb.Append(" -");
                    }

                    if((i % 256) == 255)
                    {
                        sb.Append("\r\n\r\n");
                    }
                    else if((i % 16)== 15)
                    {
                        sb.Append("\r\n");
                    }
                    else
                    {
                        sb.Append(" ");
                    }
                }

                textBox1.Text = sb.ToString();
                
            }

        }
    }
}

実行するとファイルを開くダイアログが現れるので、先ほどのELFファイルを指定します。
結果はこんな感じです。”45 4c 46”(ASCIIでELF)が最初にあってよさげです。
これで、ELFファイルのバイナリダンプができました。このTOOL上では見にくければ適当なテキストエディタなどにコピペすれば見やすくなります。

ELFファイルのダンプリスト

さて、ELFファイルですが、最初の256バイトはこうなっていました。

7f 45 4c 46 01 01 01 00 - 00 00 00 00 00 00 00 00
02 00 28 00 01 00 00 00 - 03 01 00 00 34 00 00 00
6c 5b 02 00 00 02 00 05 - 34 00 20 00 02 00 28 00
13 00 10 00 01 00 00 00 - 00 00 01 00 00 00 00 00
00 00 00 00 ac 06 00 00 - ac 06 00 00 05 00 00 00
00 00 01 00 01 00 00 00 - 00 00 02 00 00 00 00 10
ac 06 00 00 04 00 00 00 - 0c 00 00 00 06 00 00 00
00 00 01 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00

これを後述のLINKを参考に手作業で調べてみます。

ELFヘッダの手解析

7f 45 4c 46  最初の4バイトは固定です。3バイトは”ELF”ですね。
01      EI_CLASS:32ビットアーキテクチャ
01      EI_DATA:リトルエンディアン
       (複数バイトの値は下位バイトから書くということ)
01      EI Version は 1
00 - 00 00 00 00 00 00 00 00 ゼロで埋めてあるらしい。将来拡張用かな

02 00     種類。実行ファイル。(予想通りですね)
28 00     マシンの種類。ARMの仕様書に40と書いてあり一致しています。
01 00 00 00 - Version 1
03 01 00 00  e_entry; システムが最初に送る制御コードの仮想アドレス
34 00 00 00  e_phoff; プログラムヘッダテーブルのオフセット
6c 5b 02 00  e_shoff; セクションヘッダテーブルのオフセット
00 02 00 05 - e_flags; マシン固有のフラグ
34 00     e_ehsize; ELFヘッダのバイト数
20 00     e_phentsize;プログラムヘッダテーブルの登録ごとのバイト数
02 00     e_phnum; プログラムヘッダテーブルの登録数
28 00 -     e_shentsize; セクションヘッダのバイト数
13 00     e_shnum; セクションヘッダテーブルの登録数
10 00     e_shstrndx; セクション名テーブルのあるセクションテーブル番号

これで52バイトですので、テーブル中のELFヘッダのバイト数34と一致しました。
プログラムヘッダテーブルのオフセットが34なのですぐ次がプログラムテーブルだとわかります。テーブルには2つの登録がありテーブルの大きさが20なので各々32バイトです。
とりあえずセクションテーブルは使いません。フラグが何かCPUの設定を持っていそうです。

プログラムヘッダテーブル

ELFヘッダからヘッダテーブルの位置と大きさがわかりました。
次の2ブロックからなるテーブルがあるとわかりました。

エントリー1:
                  01 00 00 00 - 00 00 01 00 00 00 00 00
00 00 00 00 ac 06 00 00 - ac 06 00 00 05 00 00 00
00 00 01 00 

エントリー2
                  01 00 00 00 - 00 00 02 00 00 00 00 10
ac 06 00 00 04 00 00 00 - 0c 00 00 00 06 00 00 00
00 00 01 00

手作業で解読してみます。
エントリー1:
01 00 00 00 - p_type セグメントタイプ
00 00 01 00   P_offset セグメント内のアドレスオフセット
00 00 00 00   p_vaddr 仮想アドレスオフセット
00 00 00 00   p_paddr 相対アドレスマシン用の物理アドレス
ac 06 00 00 - p_filesz ファイル内でのプログラムのバイト数
ac 06 00 00    p_memsz メモリイメージ内でのプログラムのバイト数
05 00 00 00   p_flags メモリセグメント用のフラグ
00 00 01 00   p_align ファイル内のセグメントの配置指定のための数

エントリー2
01 00 00 00 -  p_type セグメントタイプ
00 00 02 00  P_offset セグメント内のアドレスオフセット
00 00 00 10   p_vaddr 仮想アドレスオフセット
ac 06 00 00   p_paddr 相対アドレスマシン用の物理アドレス
04 00 00 00 -  p_filesz ファイル内でのプログラムのバイト数
0c 00 00 00    p_memsz メモリイメージ内でのプログラムのバイト数
06 00 00 00  p_flags メモリセグメント用のフラグ
00 00 01 00  p_align ファイル内のセグメントの配置指定のための数

ELFファイルのアドレスオフセットの位置からfilesz分だけ読み出して使えばよさそうです。
エントリー2のファイル内のデータが4でメモリ上では12で足りませんが、不足分はゼロで埋めます。
これで、ELFからプログラムコードが取得できそうです。

FlashMagicについて

バイナリファイルを書きだしてFlashMagicで書き込むというのが当初のプランでしたが、FlashMagicが汎用ツールのためCPUのIDチェックなど手厚く処理します。このため、時々書き込めなかったりします。
ISPでの書き込み手順は公開されているので、こうなったら自分で作ることもできます。
ISP書き込みはすでに作ったことがあるので問題ないでしょう。



ELFファイルフォーマット: