2026年2月16日月曜日

シフトレジスタ[74HC595]初挑戦 UIAPduino 11番ピンに 落とし穴があった


 自作LEDゲーム機『ゲームベーダー』をつくるにあたって、まずは10個以上のLEDを扱えるようになりたいと思った。一番簡単なのはマイコンの入出力ピンをLED毎に割り当てること(10個なら10本)だけれど、それだとあっという間にピンを使い切ってしまって、他のことができなくなってしまう。少なくともLEDの他に10個のキー入力が必要だし、ぜいたくを言えば拡張用にGrove端子をつけてみたい。

 LEDを大量に扱う方法はいくつもあるけれど、最初はシンプルなシフトレジスタ[74HC595]というロジックICを使うやり方を試してみることにした。ネット上にサンプルがたくさんあるから安心だし、Arduino公式のチュートリアルにも解説があった。

 チュートリアルにはブレッドボード図も載っていた。だから見たままに繋ぐだけでOKなので、Arduino UNOに再現するのは簡単。あっさりと8個のLEDが次々と点滅した。嬉しくなって、ソースコードの中身を理解する前に部屋を暗くして思わず記念撮影をしてしまった。暗闇の中で光るLEDは、とにかくカッコイイのだ。

 次のステップでシフトレジスタを複数繋いでみたが、これも問題はなかった。3つの入出力ピン、2つの電源ピンを使うだけで16個のLEDがコントロールできる。LEDが順々に光っているだけなのに、『ゲームベーダー』への第一歩になった気がして勇気がでてくる。

 さて、「今日の最後のステップとして、Arduino UNOから本命のUIAPduinoに移植しよう!」と、勢いのままに進めてみたけれど、ちょっとした落とし穴があった。油断大敵なのだ。

 Arduino UNO用のサンプル・プログラムには、

//Pin connected to ST_CP of 74HC595 

int latchPin = 8;

//Pin connected to SH_CP of 74HC595

int clockPin = 12;

////Pin connected to DS of 74HC595

int dataPin = 11;

 と、使うピンが定義されている。UIAPduinoのピン配置図を見る限り、この3つの番号(8/11/12)は同じように使えるはず。だから特に変更をせずに試してみたけれど。なぜか、うまく動かない……。

 いろいろと試行錯誤してみたけれど、結論は「UIAPduinoの場合、11番のピンだと動かない!」らしい。これには本当にビックリした。でも、そういえば狭山ヶ丘寺子屋で、「ちゃんと動かないピンがあるなあ」と、隣の席で作業をしていた方が呟いていたような。あの時は、どんな意味かわからなかったけれど、こういうことだったのか。

 検証作業をひと段落させてからUIAPのコミュニティに、「質問です。PD1(11)って、他のピンと仕様が違うのでしょうか? LED繋いでも、このピン(とPD7)だけ光らないので…。気になっちゃって」と投稿をしてみた。

 すると、開発者のUmetaさんから、「なぁーーーーぬぅーーーーー!?!?」と光の早さでレスを頂いた。(初期状態の)Arduino開発環境だと、11番のピンは他の用途(デバッグ?)にも使われているらしく、「出力ピンとしては使えない」そうだ。つまり、「入力ピンとしては使える」から、今まで自分がつくっていたキー入力などの回路は普通に動いていたのだ。

void setup() {

  pinV32_DisconnectDebug(PD_1); // Disable SWIO (the argument is not "PD1")

  pinMode(11, OUTPUT);          // Configure output

}


void loop() {

  digitalWrite(11, HIGH);

  delay(1000);

  digitalWrite(11, LOW);

  delay(1000);

}

 というわけで、公式サイトに「11ピンを使用するにはpinV32_DisconnectDebug(PD_1)が必要です。SWIOが無効化されます。」という注意書きと上記のサンプル・プログラムが加筆されることになった。自分の報告が、他のユーザーさんの役にたつのかもしれないと思うと嬉しい。


0 件のコメント:

コメントを投稿

人気の投稿