Arduino(23) アナログマルチプレクサを使ってみた
Arduinoには、6つのアナログ入力を備えているのですが、7つ以上の入力したいときには、アナログマルチプレクサをつかうことになります。
アナログマルチプレクサとは
複数の入力から1つを選んで出力する素子をマルチプレクサといいます。通常の入力とは別に選択制御の信号のみを扱う入力があり、この信号に基づいてどの入力を選択するかを決めることになります。
応用例としては、複数の監視カメラの映像信号をひとつのディスプレイで受けるときに時間を区切って自動的に映像信号を切り替える、といった電子回路に使われています。
今回は、秋月電子で購入したTC4051BPというICを使います。
回路図
スケッチ
#include <U8g2lib.h> U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); //マルチプレクサコントロールピン int s0 = 2; int s1 = 3; int s2 = 4; //マルチプレクサ"Z"ピン int Z_pin = 0; //データ格納変数 float Data[8]; char DataStr[4][8]; void setup(){ u8g2.begin(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_8x13_tf); pinMode(s0, OUTPUT); pinMode(s1, OUTPUT); pinMode(s2, OUTPUT); digitalWrite(s0, LOW); digitalWrite(s1, LOW); digitalWrite(s2, LOW); Serial.begin(9600); } void loop(){ for(int i = 0; i < 8; i ++){ Data[i]=readMux(i); delay(100); } disp(); disp2(); delay(500); } void disp(){ Serial.print(Data[0]); Serial.print(", "); Serial.print(Data[1]); Serial.print(", "); Serial.print(Data[2]); Serial.print(", "); Serial.print(Data[3]); Serial.print(", "); Serial.print(Data[4]); Serial.print(", "); Serial.print(Data[5]); Serial.print(", "); Serial.print(Data[6]); Serial.print(", "); Serial.println(Data[7]); } void disp2(){ //dtostrf(数値, 全体の長さ, 小数点以下の表示数, 文字列変数); for(int i = 0; i < 8; i ++){ dtostrf(Data[i],4,2,DataStr[i]); } u8g2.clearBuffer(); u8g2.drawStr(0, 10, DataStr[0]); u8g2.drawStr(42, 10, DataStr[1]); u8g2.drawStr(84, 10, DataStr[2]); u8g2.drawStr(0, 21, DataStr[3]); u8g2.drawStr(42, 21, DataStr[4]); u8g2.drawStr(84, 21, DataStr[5]); u8g2.drawStr(0, 32, DataStr[6]); u8g2.drawStr(42, 32, DataStr[7]); u8g2.drawStr(84, 32, "END"); u8g2.sendBuffer(); } float readMux(int channel){ int controlPin[] = {s0, s1, s2}; int muxChannel[8][3]={ {0,0,0}, //channel 0 {1,0,0}, //channel 1 {0,1,0}, //channel 2 {1,1,0}, //channel 3 {0,0,1}, //channel 4 {1,0,1}, //channel 5 {0,1,1}, //channel 6 {1,1,1}, //channel 7 }; //loop through the 3 sig for(int i = 0; i < 3; i ++){ digitalWrite(controlPin[i], muxChannel[channel][i]); } //read the value at the Z pin int val = analogRead(Z_pin); //return the value float voltage = (val * 5.0) / 1024.0; return voltage; }