カテゴリー別アーカイブ: 電子工作

Arduinoのシールドを使うときはピンアサインを確かめよう

常識的なことかも知れませんがこういうことを書いておくのは悪いことでは無いと思うので書いておきます。

さて、今回はArduinoのシールド(Shield)についてです。Arduinoの機能を拡張するボードでArduinoの上に重ねて配置していきます。複数使うことができる物もあり、それに対して連動して処理を作ることもできます。例としてはモータードライバ+USBホストコントローラという組み合わせでしょうか。モーターをUSB機器から制御する物で、USBホストコントローラにBluetoothのドングルをつけてやるとBluetoothから制御できますし、それ以外の機器でも制御ができる様になります。

しかし、こういう風に組み合わせるときには「組み合わせるシールドのピンアサインをあらかじめ調べておく」必要があります。これは制御ICが同じ物であっても出しているメーカーによってはArduinoと通信するデジタルピンのアサインがかなり異なるからです。今回はちょっとその例を出してみたいと思います。

ちなみに以下で出てくる加工をもし行う場合はは自己責任でお願いします。

 

同じメーカーが出しているのに同時使用ができないとは

購入した店で扱っていたのがSparkFunの製品で、今回対象にしたのは


の二つです。どちらも単体としては普通のシールドです。一応今回の工作ではモータードライバシールドを使って動く物が作れたので良かったのですが、それはまあ置いておいて。

問題はこの二つの製品のピンアサインです。どういうことかと言いますと

  • モータードライバ:ピン3,11~13を使用
  • USBホストシールド:ピン7~13を使用

というように、この場合はピン11~13が重複していることになります。こうなると基本的に正しい動作を望むことができなくなり、この二つは同時に使用できない、ということになります。無理に同時使用するならおそらくモータードライバシールドを加工することになると思うのですが

  1. ピンヘッダが付いている状態で半田付けで以下のピンを基板の裏側でつなぐ(できるだけ根元で)(3pin=>5pin、11pin=>6pin、12pin=>2pin、13pin=>4pin)
  2. 3、11~13pinの半田付けした部分より下をラジオペンチで切断する(絶縁処理でも可)
  3. このモーターシールドを使用するときは最上段になるようにし、PWM A=>5pin、DIR A=>2pin、PWM B=>6pin、DIR B=>4pinで使用する

という方法が考えられます。が、やりたくはないですよね。失敗すると数千円+手間が吹っ飛びますから。またはICの足を持ち上げてプリント基板から切り離した上で線を接続する、という方法もありますが、それもそれで大変ですね。それよりはピンアサインがかぶっていない基板を探す方が簡単ですよね。たとえば秋月電子通商が扱っているモータードライバシールドとUSBホストシールドの組み合わせだと

  • モータードライバ:ピン4~7を使用
  • USBホストシールド:ピン8~13を使用

で重複していないため同時使用が可能です。本当はモータードライバだけでも大丈夫だと思ったのですが、SparkFunの製品だと7pinをUSBホストシールドのリセットピンとしてアサインしているためカットかICの足を持ち上げる加工が必要です。カットの場合は元に戻すことは基本的にできないですし、ICの足を持ち上げるのはICのピッチが狭いのでよほど慣れていないと失敗します。(一応この後の手順を紹介すると、足をカットした場合は7pinとRSTピンを裏側で配線すればOKのはず)

 

この辺の加工も醍醐味と言えば醍醐味

うまく使える様にピンをわざと切ってしまうのもおもしろいと言えばおもしろいです。実際、SparkFunのモータードライバシールドでは外部電源を入れようとするとVinと直接つながっているため、そのままではなんとモータードライバシールドに電源をつなぎ、Arduinoには電源をつながずに乗せるとArduinoに電源が入ります。モーターの電力の問題から単一の電源でやるときにはこうした方がいいかもしれませんがまあ何とも。対処法としては(試していないので何ともいえませんが)ArduinoにつながるピンのうちVinを切断するとこの問題は解決できると思います。別のモータードライバシールドだと外部電源との分離設定が基板上にあることもあるのですが。

ただ、SparkFunの基板はほかの完成基板と違って空き領域にユニバーサル基板の様な配線を組める領域があるのでこちらで自分が考えた回路を実装することで拡張することができる分うまく回路を組めばさらにスタックする必要が無いことがないのが特徴でしょうか。素直に別の基板をスタックすればすむだけと考える人もいるかも知れませんが、高さを抑えることができる分いいかもしれません。

 

ほかの基板でもこういうピンアサインの問題はあるので購入前には調べましょう

調べなかった私が悪いのかも知れませんが・・・。組み合わせで対象の動作ができることは分かっても組み合わせそのものができなくなるのは想定外でしたし。まあいろいろと楽しませていただきました、ということで。

Arduinoで遊んでみた

しばらく更新が止まったままになっていたりする物もありますが、たいていの原因はこれです。とある都合でArduinoでいろいろと実験してみる必要が出てきたのでArduinoを購入していろいろと実験をしていた、というわけです。ただ、ブレッドボードを持っているわけではないので実験用の回路を作ってみるのでも一度簡易的であれ回路図を作った上でユニバーサル基板上に落として部品を組み立ててみる、という工程を取っているのであまりにも効率が悪かったりします。たぶん次はRaspberry Piも試すことになると思うのでそのときはブレッドボード(+ジャンパ線)を購入して試せる様にしたいと思います。まあ、今回はちょっとしたテストなのでそれほど複雑なことは考えずにがんがんやっていった結果、で書いています。

 

実験レベルの物なら31.5kBものメモリを使うのは難しいよね・・・と思ったら

いきなりいろいろと話題に入っていきたいと思います。プログラムでは映像系や音楽系などが好きな人間なのでその手を初めに試すのがやり方なのでまずは音を鳴らす様なルーチンを組んでからそれを拡張を、とやっていったわけですが、いろいろと大変でした。音楽系については外部のチップを使わないパターンでもArduino Tone Libraryやその他いろいろな人がライブラリを使っていますのでそれを使えば意外とあっさりと音を出すことはできます。動作的には大変ですが、プログラム上でミキシングなどもできますしね。音系に関してはピンの制約も大きいので回路を作る場合はそのあたりは気をつけた方がいいです。最低でもPWMを使えるピンにつなげた方がいいですし、アナログ的な波形を作り出すときにはハードウェアカウンタの協力が必要なので。

で、調子に乗って楽譜を組み込んで再生させてみよう、というわけではまったのがこの現象。Arduinoではコード実行中に読み込み専用となるデータの場合はフラッシュメモリ上に残したままで実行が可能で特殊な命令で読み込む、ということ基本となります。そのため、通常メモリ内に楽譜データなど意外と大きいデータを置いたまま実行すると実行にプログラムが使用できるメモリはそれほどない(最も一般的と思われるArduino Unoで2kB)なので、フラッシュ内に残る様に指示をしないとローダーで読み取られるプログラム部+データ部で2kBを使い尽くしてプログラムが実行できない、という間抜けな状態になってしまいます。そのあたりはいろいろと考えましょう。

ちなみに、フラッシュメモリにデータを残したままにしても楽譜の様にどれだけでもデータとして組み入れることができる物を考えると31.5kBなんて意外とあっさりと食われます。たとえば8bitのPCMデータをフラッシュメモリに転送してArduino経由でPWMを使って再生する、なんかをやると少なすぎることになりますからね。音楽系でArduinoを調べるとMIDIやFM音源、といった要素に行き着くことが多いのも当たり前と言えば当たり前ですからね。

 

ハードウェアを直接動かすプログラムは楽しい

いつもはPCやiOSなどのプログラムを組んでいるのでだいたいはOS上で管理される資源にアクセスするだけなのですが、Arduinoのようになってくるとたとえばデータによっては1byteを争う様なことも多く、列挙型がint型と同じメモリ容量を使う=2byteを使うのでフラッシュメモリ内に置くのであればbyte型の使用を検討してみたりやタイマ割り込みを使うためにライブラリではなく自前で各種レジスタにアクセスして処理を作ってみたりや、最後にはライブラリ関数を使わずにいくつかの処理をハードウェアを直接たたいて使うことで動作速度を向上させていったりとか。こういう変なチューニングはOSの動作の中で、に慣れきった状態からだと余り思いつかないですからね。画像処理などでSIMDの演算を使う、ということはないわけではないですが。

あとはプログラム以外にもスイッチからの入力やLEDやスピーカーを回路を構成して配線することで直接制御するなどプログラムの醍醐味でもある「自分の思ったとおりにハードウェアを動かす」というのがPC上でのプログラム以上によく見えるので少しC言語を勉強した後であれば教育用の教材としてもおもしろいかも知れないな~と考えながら実験をしていました。回路の知識もある程度必要なので純粋なプログラムとはちょっと違うかも知れませんが、それでもおもしろいことに変わりは無いです。別のチップと組み合わせてみたり、というのも知識さえあれば遊べますからね。

今からの季節だと一番あり得そうなのが「クリスマスのイルミネーションをArduinoで制御する」と言った発想でしょうか。出力端子はArduino Unoで13本(PWM制御を使用する場合でも6本)あるのでそれにオペアンプやパワーMOSFETなどをドライブさせてLEDをちかちかさせればツリーレベルでもどうにかできるはずですし。絶対にできることは保証しますがLEDの仕掛けを作るのが面倒ですか。