ド素人がRaspberry Piを使って発見した、いくつかの誤り

電子工作が初めてで右も左もわからなかったため、なるべく複数の情報源から調査するようにしていました。そして、必ずしも書籍に書かれていることが正しい訳ではない事がわかってきました。

私が電子工作のド素人であるというのは幸運なことだったかもしれません。ド素人でなければ、きっとこれらの事を疑問に思いもしないし、気付かなかったのではないかと思います。せっかくなので情報共有しようと思います。

誤り1

日経Linux 2013年3月号

この本は私がRaspberry Piを知るきっかけとなったありがたい本ですが、いくつか誤りがありました。まずはGPIOの出力についてです。

BCM2708で注意しなければならないのは、必ず1度だけ入力モードに設定し、その後に出力モードする必要があることです。

そのような必要はなく、GPIOをただちに出力モードに設定することが可能です。

この誤りは恐らく、日経Linux 2013年3月号が引用したelinux.orgのソースコードに書かれている

INP_GPIO(g); // must use INP_GPIO before we can use OUT_GPIOOUT_GPIO(g);

という記述からだと思われます。

なお、Raspberry Piに使用されているのはBCM2708ではなくBCM2835です。これが誤りの原因かはわかりませんが・・・。

ラズベリーの生みの親であるケンブリッジが公開しているコードでは、ただちに出力モードにしており、実際に動作することを確認しました。

if (direction == OUTPUT)
*(gpio_map+offset) = (*(gpio_map+offset) & ~(7<<shift)) |="" (1<<shift);<="" pre="">

C library for Broadcom BCM 2835 as used in Raspberry Piでも同じコードがあります。

v = (v & ~mask) | (value & mask);

誤り2

誤り1で取り上げたケンブリッジのソースコードにも誤りがあります。これはプルアップとダウンをGPIOへ設定するためのコードです。

short_wait();
*(gpio_map+clk_offset) = 1 << shift;
short_wait();
*(gpio_map+PULLUPDN_OFFSET) &= ~3;
*(gpio_map+clk_offset) = 0;

正しくは

*(gpio_map+PULLUPDN_OFFSET) &= ~3;
*(gpio_map+clk_offset) = 1 << shift;
short_wait();
*(gpio_map+clk_offset) = 0;
short_wait();

です。

2014/11/09訂正: 誤り2は誤りではありませんでした。SC1602とBCM2835ではクロックの定義が違うのですが、私がそれを知りませんでした。(^^;;

誤り3

日経Linux 2013年3月号のRaspberry PiとSC1602の配線図に誤りがあります。

 

誤りのある配線図

誤りのある配線図

正しい配線図

正しい配線図

以下のページでSC1602の配線について扱っていました。

液晶表示モジュールを4ビットモードで使ったときの空きピン処理

ラズベリーからSC1602へ出力するだけであれば、たとえ上記の「誤りのある配線図」であっても動作はします。しかし、SC1602に想定外の問題が起こり、DB0-3が入力から出力になってしまった場合、SC1602からラズベリーへ電気が流れる事になります。すると、これらの回路は抵抗を持たない閉回路になるため過電流が発生します。

実際にはRaspberry PiとSC1602のDB全てが抵抗を内部に持っており、かつRaspberry Piには過電流の発生を検知して自動的に電源を落とす機能がある※ので、破損はしないようです。

※この情報は私見です。よく間違えてショートさせてしまうのですが、そのたびにRaspberry Piの電源が落ちていますので、事実だと思います。

この間違いは収束していないようです。秋月電子にて赤外線リモコン学習キットを購入したのですが、これにも同じ間違いがありました。

秋月電子 赤外線リモコン学習キットのSC1602端子

秋月電子 赤外線リモコン学習キットのSC1602端子

DB0-3とR/WがGNDに接続されてます。

また、先ほどのページには、SC1602へデータを送った後、次にデータを送るまでの待機時間と電圧のかけ方についても書かれていたので、実際に試してみました。やることは簡単です。SC1602へ何らかのコマンドを送った後、次のコマンドを送るまでの間、E以外(DB, R/W, RS)につないだGPIOの設定を、入力モード、電圧ON、プルUPに設定するだけです。実際に電流を測ってみて驚きました。

GPIO and Current電流が半分以上減りました。効果絶大です。そして、知らない事はとても損であることと、知らない事に気づくというのが、いかに難しいかということを思いました。

誤り4

日経Linux 2013年3月号にあるRaspberry Piとスイッチの配線図です。

Nikkei201303-3GPIO4とSWの間にも抵抗を入れるべきです。

Nikkei201303-4ケンブリッジのページの説明の通りです。もし間違ってGPIOを出力モードにしてしまった場合、Raspberry Piに過電流が発生します。

もし本記事に興味、ご関心があれば、ぜひ「ラズベリーと電子工作の記事一覧」を見てください。例えばこんな記事があります。

  • ド素人がRaspberry Piで電子工作を始める
    ラズベリーパイ財団が制作したたばこの箱サイズのパソコン「Raspberry Pi」は、私をパソコンから電気工学へ橋渡ししてくれる存在となりました。基盤やコネクタに群がるゾンビにしてしまったと言った方が正確かもしれませんが(笑)。
  • Raspberry Piで電子工作 その2
    電流、抵抗、電圧の意味がわからず、アキバのパーツ屋で買物すらできなかった私。勉強のためにお金をつぎ込んだ結果、だんだんと意味がわかってきました。
  • Raspberry Piでの電子工作にあたって購入した道具
    ラズベリーで電子工作を始めて4ヵ月が経ちました。勉強を進めるにあたり、本や電子パーツ、道具など、必要に応じて購入する必要がありました。今日は私がラズベリー以外に購入した道具を紹介します。

This post is also available in: 英語

Administrator へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です