格安シリアル変換を作ろう!!!
秋月で売ってるやつを自作すると100円ほど安くなる気がしたので、作ります。
そこまで格安ではない。
変換ICはWCHのCH340Kを使います。
https://akizukidenshi.com/catalog/g/g116306/
環境はwin11、arduino IDE2.3.4、arduino UNO R4です。
設計
秋月に売っているものをまるパクリするので設計もクソもありません。
書いてあるものを参照して、適当に作ります。(適当なのでヒューズは搭載しません(ダメ))
https://akizukidenshi.com/catalog/g/g114745/
上記のモジュールのICと今回使うICは別物なので、細かい機能が異なります。
https://akizukidenshi.com/goodsaffix/ch340.pdf に詳細が書いてあります。
部品
ユニバーサル基板はアマゾンで、それ以外は秋月で購入します。
合計価格は425.3円でした。
秋月で同型のICを使ったしいえる変換モジュールは550円なので、124.7円安くなりました。
制作
まずは秋月の↓を参考にして実装します。
https://akizukidenshi.com/goodsaffix/AE-CH340E-TYPEC.pdf
プログラムは caa45040 さんの記事を参考にします。
https://qiita.com/caa45040/items/8a7fcf4b4755763b49d8
元記事はwin10でしたが、win11でも動作しました。
検証
書き込みができたら実際に通信を行ってみます。
制作したモジュールのRXをTX、TXをRXに接続します。
そしてUSBでArduinoとモジュールをPCに接続します
void setup(){
Serial.begin(9600); // シリアル通信(USB側)の開始(ボーレート9600bps)
Serial1.begin(9600); // シリアル通信(UART側)の開始(ボーレート9600bps)
pinMode(13, OUTPUT);
}
void loop(){
while(Serial1.available() > 0){ // シリアル受信(UART側)の検知
int val = Serial1.read(); // データを読み取る
Serial1.write(val); // シリアル送信(UART側)
Serial.write(val); // シリアル送信(USB側)
if(val == '1'){ // "1"ならLEDを点灯,"0"ならLEDを消灯
digitalWrite(13, HIGH);
} else if(val == '0'){
digitalWrite(13, LOW);
}
}
while(Serial.available() > 0){ // シリアル受信(UART側)の検知
int val = Serial.read(); // データを読み取る
Serial1.write(val); // シリアル送信(UART側)
Serial.write(val); // シリアル送信(USB側)
if(val == '1'){ // "1"ならLEDを点灯,"0"ならLEDを消灯
digitalWrite(13, HIGH);
} else if(val == '0'){
digitalWrite(13, LOW);
}
}
}
UNO R4(RA4M1)と、Leonardo(ATmega 32u4)はUARTシリアルとUSBシリアルが別であるため上のプログラムで使えますが、UNO R3(ATmega 328p)はUARTをUSBにシリアル変換して使っているため、上のプログラムでは使えません。別途プログラムをネットから拾ってください。
使用するボードに応じて"13"を変更してください。
arduino IDEを2タブ開いて、のCOMポートのシリアルモニタを開きます。片方にシリアルを送信すると、両方にシリアルが帰ってきます。
1を送信すると、LED(GPIO13)が点灯し、0を送信すると消灯します。
余談ですが、Serial.writeでは文字列がそのまま送信され、Serial.printではASCIIなどで送信されるようです。
上手く動かなかったら気軽にコメントください(解決できるとは言っていない)
お読みいただきありがとうございました。