質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

4回答

7869閲覧

Arduino unoで8*16のマトリクスをダイナミック制御したいです

AZDDI

総合スコア25

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2015/11/08 13:18

編集2015/11/08 15:27

長いです、申し訳ありません

###前提・実現したいこと
Arduinoを用いた小規模な電光掲示板を制作中です

現在の技量は、Arduinoのシリアルpin2~13とアナログpin0~3の計16個のピンを用いて8*8マトリクスを制御できた程度です

実現したいことは、表題の通り制御するマトリクスを8*16に拡張することです
そのために、shiftOUT関数の仕様が知りたいです

###発生している問題・エラーメッセージ
8*16を制御しようとすると、Arduinoのピン数が足りくなるため、シフトレジスタICを用いた制御に変えたいと思います
部品と時間の都合上シフトレジスタで代用せざるを得ません
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2349
ですので、こちらのサイト様を参考にさせていただいていますが、shiftOut関数の仕様がよくわかりません

↓にイメージを貼付しています。

###ソースコード

Cで良いのでしょうか?

1//シフトレジスタに割り当てるArduinoのピン番号 2int latchPinA = 3; 3int clockPinA = 4; 4int dataPinA = 2; 5 6int latchPinC = 6; 7int clockPinC = 7; 8int dataPinC = 5; 9 10void setup (){ 11 12 pinMode(latchPinA,OUTPUT); 13 pinMode(latchPinC,OUTPUT); 14 pinMode(clockPinA,OUTPUT); 15 pinMode(clockPinC,OUTPUT); 16 pinMode(dataPinA,OUTPUT); 17 pinMode(dataPinC,OUTPUT); 18 19 digitalWrite(dataPinC,LOW); //ここ2行で初期設定、待機状態にしている 20 digitalWrite(dataPinA,HIGH); 21 22} 23 24void loop (){ 25 26 //アノード側ループ 27 for (int i=0;i < 8;i++) 28 { 29 digitalWrite(latchPinA,LOW); //送っている行はLOW 30 31 shiftOut(dataPinA, clockPinA, LSBFIRST, 1<<i); //行を選択している(?) 32 33 //カソード側ループ 34 for (int j=0;j < 8;j++) 35 { 36 37 digitalWrite(latchPinC,HIGH); 38 shiftOut(dataPinC, clockPinC, LSBFIRST, 1<<i); 39 delay(100); //ここで点灯時間を設定している 40 digitalWrite(dataPinC,LOW) ; //送り終わった列はLOWにする 41 } 42 digitalWrite(latchPinA,HIGH); //送り終わった行はHIGHにする 43 } 44}

###補足情報
http://i.imgur.com/Ig67jR4.png
組んでいる回路のイメージです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

74HC595を使って、シリアルで制御する事にしたのですね。

shiftOUT関数の仕様は以下にドキュメントされているようです。
https://www.arduino.cc/en/Reference/ShiftOut

ソフトウェアで実現される、SPI仕様の単純なシリアル出力のようです。
74HC595 を制御する場合は、これ以外にラッチクロックの制御も必要です。

回路の詳細がよく見えないのですが、ラッチクロックは H にしたときにラッチされるようですので、

C

1 digitalWrite(latchPinX,LOW); // 出力が変化しないように 2 shiftOut(dataPinX, clockPinX, LSBFIRST, ledData); //出力データを8ビット分送信 3 digitalWrite(latchPinX,HIGH); // 出力データをラッチして、実際に出力

こんな感じになると思います。

shiftOUT関数は8ビット単位の出力のようですので、特に1ビットずつ制御したいのでなければ、1重のループですむと思います。(参考のHPの方は、1ビットずつ制御するためにデータをシフトしています)
また、シフトデータはラッチ(=ラッチクロックをHにした時)した時に出力されますので、なんとなく順番がちぐはぐな気がします。

ソフトはこんな感じになるのではないかと思います。(検証はしていません。すみません)

C

1void loop (){ 2 3 //アノード側ループ 4 for (int i=0;i < 8;i++) 5 { 6 digitalWrite(latchPinA,LOW); //送っている行はLOW 7 shiftOut(dataPinA, clockPinA, LSBFIRST, 1<<i); //行を選択 8 9 //カソード側 10 digitalWrite(dataPinC,LOW) ; //送り終わった列はLOWにする 11 shiftOut(dataPinC, clockPinC, LSBFIRST, ledData); 12 //shiftOut(dataPinC, clockPinC, LSBFIRST, ledData2); // カスケード接続で 8x16の時 13 //shiftOut(dataPinC, clockPinC, LSBFIRST, ledData3); // カスケード接続で 8x24の時 14 //shiftOut(dataPinC, clockPinC, LSBFIRST, ledData4); // カスケード接続で 8x32の時 15 // : : : : : : 16 17 digitalWrite(latchPinA,HIGH); //ラッチして出力 行選択を出力(1ビットのみONの8BITデータ) 18 digitalWrite(latchPinC,HIGH); //列データを出力 19 20 delay(100); //ここで点灯時間を設定 21 } 22 23 digitalWrite(latchPinA,LOW); //念のため 24 digitalWrite(latchPinC,LOW); 25}

8x8 の個数をLEDを増やす時は、74HC595をカスケード接続して必要な個数分 shiftOUTを並べてやればソフト的にはよいでのですが、、、

結論から言うと、たぶんこの回路ではだめな予感がします。

見せていただいている回路では、ポート出力がアノード側に接続されたアクティブHで点灯する構成になっている事にご注意ください。前回に注意点としてあげましたが、この接続ですとポート出力でLEDをつけることになってしまっています。おそらく、元ネタではその辺の問題に目をつぶるために、あえて2重ループにしてLEDを1個ずつ点けるようにしていた気がします。

つまり、列選択出力側の選択された1ビットのポートは、供給しなければならない電源は8x8構成で最大8個。8x16で最大16個になりますよね? このとき、ポートがLED点灯のために出力しなければならない電流は8x8構成なら「たぶん大丈夫」。8x16構成だと「もしかして実力で動くかもしれないけど、たぶん公称能力は超えてしまっている」な感じになると思います。


電源の増強で試行錯誤されている方のHPを発見しましたので参考にどうぞ。

この方は TD62083 を使っているようです。たぶん、これで10個ぐらいまではOK?(笑)

参考HP

投稿2015/11/08 15:00

編集2015/11/08 15:27
T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AZDDI

2015/11/08 15:46

丁寧な回答ありがとうございます ・私のプログラムだとラッチの記述の順番が逆 ・マトリックス側のアノードとカソードの配置が逆じゃないと電源が厳しい ・トランジスタアレイを使えば解消できるかもしれない という解釈でよろしいでしょうか?
T.Kanno

2015/11/08 15:56

はい。その解釈でOKです。 アナログチックな部分がなかなか面倒ですよね。
AZDDI

2015/11/08 16:17

ありがとうございます 一度電源系統を見直してみる必要がありそうですね 幸いトランジスタアレイは手元にあるのでいろいろ考えてみます ちなみに、マトリックス側のアノードとカソードの位置を逆にすれば電源系統は問題なさそうですか? なんでもかんでも聞いてしまって申し訳ありません
T.Kanno

2015/11/08 16:54 編集

トランジスタアレイで行くなら参考HP(正論理だったかな?)に習うのも手かもしれませんね。 負論理駆動にすると、すべての問題が無いかといわれれば、そう簡単ではないと思うのですが、点灯LEDの数や流れる電流には無頓着で当面の自由度があがるはずです。ただ、それでもArduinoの5Vから取れる電流にも上限があるはずですので、どちらにしても注意は必要ですね。
guest

0

これに似た回路を昨年しました(74hc595とTD62083,62783をつかった)
初めての回答なのでわかりにくいと思いますが

http://akizukidenshi.com/download/ds/ti/sn74hc595.pdf
ここの3,4ページが参考になるのではないでしょうか?
SRCLKとRCLKとSER以外は置いといて
SER:シフトするデータ入力
SRCLK:パルス数だけシフト
RCLK:Hiの時のデータを出力Loにしても出力は保持される

という風に考えるといいと思います

よくわからないのであれば適当なプログラムを組み、シフトレジスタをテスタなりロジアナなりで見てみるのもいいと思います
頑張ってください!!

ただこの回路インバーターとバッファ組まないと電流が足りない可能性が・・・

投稿2015/11/08 14:33

編集2015/11/08 14:42
fujimon7111

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2015/11/08 14:45

> ただこの回路インバーターとバッファ組まないと電流が足りない可能性が・・・ ああ、確かに。 スキャン駆動して一度に点灯するLEDを最大8個くらいに制限すれば行けるかも?
fujimon7111

2015/11/08 15:06

電流が足りていない状態でつくると表示内容によって明るい列と暗い列が生まれてしまうかもしれません 抵抗値を上げるのもいいかも(未確認です 妥協,お金,時間との相談ですかね プログラムも分かればいいのですがC18しか使ったことがないもので力になれずすみません
AZDDI

2015/11/08 16:19

回答ありがとうございます 電源系統のこと、一度見直してみようと思います 頑張ります!
guest

0

8x16をスキャン制御するのに16本の出力ピンが使えるのであれば、3入力8出力のデコーダを2つか、4入力16出力のデコーダを1つ使えば十分と思いますよ。


【追記】
こちらにコメントへの回答を書きます。
リンク先の資料にはサンプルのソースと回路図があり適切な説明もあるので、正直、これを超える説明ができないです。

闇雲ですが、思いついた補足をしてみます。

shiftOut()関数はソフトウェアでクロック同期式のシリアル出力を行う関数です。
ここはクロック同期式シリアル入出力の説明です。
これのマスタ側がArduino、スレーブ側が74HC595と考えて下さい。
そして、マスタ側SIとスレーブ側SOは無いものとして考えて説明を読むとイメージは掴めると思います。

ところで、回路イメージでは74HC595は3つあるのに、ソースではシリアル出力を2つしか用意していないようですけど、これは何故でしょうか?
単純にシリアル出力を3セット使えば素直に作れそうな気がします。

もしかして 1<<i が分からないのでしょうか?
これは単に1をiビット左シフトするだけです。
i==0の時は、1
i==1の時は、2
i==7の時は、128
になります。

投稿2015/11/08 13:35

編集2015/11/08 14:43
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AZDDI

2015/11/08 14:05 編集

速やかな回答ありがとうございます 申し訳ありませんが、今現在は手元にある部品(シフトレジスタ)を使って回路を組まざるを得ない状況です よろしければシフトレジスタの制御方法を教えて頂ければ幸いです
T.Kanno

2015/11/08 15:34

横レス失礼します。 >ところで、回路イメージでは74HC595は3つあるのに、ソースではシリアル出力を2つしか用意していないようですけど、これは何故でしょうか? 2つはカスケード接続されて、1回線で制御できるように見えます。上の方の緑のラインです。
Chironian

2015/11/08 16:06

ああ、そういうことでしたか。了解です。 ってことは、16ビット側をスキャンするようにして、16ビット側はshiftOutを使わないで単純に1を1ビットずつシフトしてスキャンしたくなっちゃいますね。 より軽いソフトって好きです。
guest

0

秋月のAVR日本語サイトがあるので、
AVR日本語情報サイト
http://www.avr.jp/
この中から、関連部分だけでも良いので、質問者さんには、読んで欲しいなぁ。
(UNOで使用している、CPU)

鉄道、地下鉄、バス、空港の16、24は、
LEDマトリックス専用ドライブ基盤+コントロール基盤で
できています。
使った事がある範囲では、各社のオリジナルだったり、OEMだったり。
古いところではコパルのモジュールだった。
市販の安い奴や、新幹線ホームの新型(パナ)、
韓国製は機会がないので、解りません。
'
ズバリでなくても良ければ、
Arduinoで16x16 LEDドットマトリックスを利用する(2)
http://nuneno.cocolog-nifty.com/blog/2014/07/arduino16x16--1.html
Arduinoを使って8X8マトリクスLEDに日本語テキスト文字を表示する
http://www.geocities.jp/bokunimowakaru/diy/arduino/matrix_led.html

投稿2015/11/08 15:45

編集2015/11/08 15:50
daive

総合スコア2030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AZDDI

2015/11/08 16:12

申し訳ありません このデータベースを読んで理解することは私にはまだまだ先のことのようです、書いてあることが全く理解できませんでした つまり電源が足りてないからトランジスタアレイを挟むことを考えた方がいいということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問