🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Arduino

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

Q&A

解決済

2回答

3812閲覧

シフトレジスタを2個にするときどうすればいいですか

aoi729

総合スコア6

Arduino

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

0グッド

0クリップ

投稿2019/09/16 23:46

以下のサイトのプログラムを使用したのですが、シフトレジスタを増やす場合二進数の数を増やせばいいのでしょうか?
それとももっと簡単な手段があるのでしょうか。
シフトレジスタ制御

コード #define SRCLK (5) #define RCLK (6) #define SER (7) void setup() { pinMode(SRCLK, OUTPUT); pinMode(RCLK, OUTPUT); pinMode(SER, OUTPUT); } // 点灯パターン(1=点灯, 0=消灯) const uint8_t PATTERNS[] = { 0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b10000000, }; void loop() { // 点灯パターンの数 int max_pattern = sizeof(PATTERNS)/sizeof(PATTERNS[0]); for (uint8_t i=0; i<max_pattern; i++) { // 8ビット分のデータをシフトレジスタへ送る shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i]); // シフトレジスタの状態をストレージレジスタへ反映させる digitalWrite(RCLK, LOW); digitalWrite(RCLK, HIGH); delay(200); }

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

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

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

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

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

ikadzuchi

2019/09/17 01:08

「二進数の数を増や」すというのがどのようなことを指しているのか分かりません。 具体的にどのようなコードにしようとしているのかを書いてください。
aoi729

2019/09/17 14:39

シフトレジスタが一つの場合 0b11111111 二つの場合 0b0000000011111111 のように、シフトレジスタを増やすたびに数を増やせば制御できるという浅はかな考えですが、この考えは間違ってますか?
ikadzuchi

2019/09/17 16:32

まだいまいちどこをどう書き換えるつもりなのか分かりませんが、 少なくともshiftOut()関数の中身を変えないと駄目でしょうね。
aoi729

2019/09/19 02:27

なるほど、いろいろ試してみます
guest

回答2

0

ベストアンサー

単純にSN74HC595をArduinoに2系統つなぐ場合、
例えば8,9,10ピンを使うとしたら、こんな感じかなと思います。

C

1#define MAX_CH 2 2 3const uint8_t SRCLK[MAX_CH] = { 5, 8 }; 4const uint8_t RCLK[MAX_CH] = { 6, 9 }; 5const uint8_t SER[MAX_CH] = { 7, 10 }; 6 7void setup() { 8 for(int ch = 0;ch < MAX_CH;ch++){ 9 pinMode(SRCLK[ch], OUTPUT); 10 pinMode(RCLK[ch], OUTPUT); 11 pinMode(SER[ch], OUTPUT); 12 } 13} 14 15// 点灯パターン(1=点灯, 0=消灯) 16const uint16_t PATTERNS[] = { 17 0b0000000000000001, 18 0b0000000000000010, 19 0b0000000000000100, 20 0b0000000000001000, 21 0b0000000000010000, 22 0b0000000000100000, 23 0b0000000001000000, 24 0b0000000010000000, 25 0b0000000100000000, 26 0b0000001000000000, 27 0b0000010000000000, 28 0b0000100000000000, 29 0b0001000000000000, 30 0b0010000000000000, 31 0b0100000000000000, 32 0b1000000000000000, 33}; 34 35void loop() 36{ 37 // 点灯パターンの数 38 int max_pattern = sizeof(PATTERNS)/sizeof(PATTERNS[0]); 39 40 for (uint8_t i=0; i<max_pattern; i++) { 41 // 8ビット分のデータをシフトレジスタへ送る 42 for(int ch = 0;ch < MAX_CH;ch++){ 43 shiftOut(SER[ch], SRCLK[ch], LSBFIRST, PATTERNS[i] >> (8*ch)); 44 } 45 46 // シフトレジスタの状態をストレージレジスタへ反映させる 47 for(int ch = 0;ch < MAX_CH;ch++){ 48 digitalWrite(RCLK[ch], LOW); 49 digitalWrite(RCLK[ch], HIGH); 50 } 51 52 delay(200); 53 } 54}

74HC595を使ってarduinoの16ビットパラレル出力に挑んでみた
みたいにArduinoとの接続が1系統でキャリービットもう1系統につなぐ場合は
shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i]);
shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i] >> 8);
とすればいいと思います。

投稿2019/09/18 10:52

編集2019/09/18 13:38
nomuken

総合スコア1627

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

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

aoi729

2019/09/18 13:15

ありがとうございます!とても分かりやすく参考になります。
aoi729

2019/09/19 03:00

二進数で場所をしていると思うのですが、十進数で指定することなど可能ですか?
nomuken

2019/09/19 03:06

可能です。 例えば 0b00010000 と書いてある箇所は 16と書いてもいいですし、0x10と書いてもいいです。
aoi729

2019/09/19 04:29

なるほど、わかりました! あと、一系統でする場合、 shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i]); shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i] >> 8); このプログラムを 私が提示したプログラムに付け加えたらいいのですか、それともあなたが提示したプログラムに付け加えればいいのですか?
nomuken

2019/09/19 05:05

aoi729さんのコードに付け加えてください。y_waiwaiさんが回答した内容と同じになります。
aoi729

2019/10/24 07:43

お久しぶりです!無事、シフトレジスタを、二個制御できました! 次、五個制御にチャレンジしたいのですが、同じshift Outのところを変更すればいいのですか?
nomuken

2019/10/24 09:50

はい。shiftOutを2回呼び出していたところを5回呼び出してください。40bitのデータの持ち方についてはご自身で検討ください。
guest

0

C

1 2// 点灯パターン(1=点灯, 0=消灯) 3const uint16_t PATTERNS[] = { 4 ... 5}; 6 7void loop() { 8 9 // 点灯パターンの数 10 int max_pattern = sizeof(PATTERNS)/sizeof(PATTERNS[0]); 11 12 for (uint8_t i=0; i<max_pattern; i++) { 13 // 16ビット分のデータをシフトレジスタへ送る 14 shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i]>>8); 15 shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i]&0xff); 16 17 // シフトレジスタの状態をストレージレジスタへ反映させる 18 digitalWrite(RCLK, LOW); 19 digitalWrite(RCLK, HIGH); 20 21 delay(200); 22 }

これで16ビット分

投稿2019/09/17 00:12

編集2019/09/17 00:21
y_waiwai

総合スコア88038

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

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

y_waiwai

2019/09/17 00:22

ちと勘違いしてたんで修正
aoi729

2019/09/17 14:41

プログラムの提示ありがとうございます! 参考にさせてもらいます!
aoi729

2019/10/24 13:20

shiftOutの>>8と&0xffの関係性を教えてください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問