自作Arduinoを作った

高二 電光班員

制作物画像

alt text

上にあるやつが Arduino 公式のやつ alt text

はじめに

この記事は小学生向けというよりも電子工作をやっている外部の人向けになっています。ご了承ください。

また、物理部では執筆時点でArduino Uno R4を入手していないためこの記事中の Arduino Uno は断りがなければ R3 の方を指します。

Arduino とは何?

Arduino について解説しようとしましたが大変説明が難しいので詳しくはこちらを参考にしてください。

回路図

alt text

ブロックごとに解説

ここからはそれぞれの部分に分けて解説していきます。ベースとしたのもはArduino Unoです。

電源

本家(Uno R3)は最近使わないプリンターなどの限られた用途でしか使われていない(ただ物理部では未だバリバリの現役の)USB type B が使われています。今回は最近使われるようになってきた USBtypeC を使った。

USBtypeB

USBtypeC

wikipedia より

USB type C を使うにあたって電源構成を考えたときに typeC では最大 100W 取れるのでこれを使うことにしました。typeC から特定の電圧を取り出すにはこの記事を参考にさせてもらいながらCH224Kを使用した(チップ本体はそんなに高くなかったが、変換基盤が高かった……)。また、取り出す電圧を変更する回路には前に使ったATtiny84が部室に転がっていたのでこれを使用した。コードについては動けがよしという流れで書いているので参考にならないかもしれない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
const char CFG[]={0,9,10};
const char PG=1;
const char buttons[]={5,4};
const char SIG=6;
const char MODE=7;
const int values[]={0,7,14,21,27,33};

// 1:5V 2:9V 3:12V 4:15V 5:20V
int value=1;
bool lastUpButtonState=false;
bool lastDownButtonState=false;

void setup() {
  for(char i:buttons){
    pinMode(i,INPUT);
  }
  for(char i:CFG){
    pinMode(i,OUTPUT);
  }
  pinMode(MODE,OUTPUT);
  pinMode(buttons[0],INPUT_PULLUP);
  pinMode(buttons[1],INPUT_PULLUP);
  digitalWrite(MODE,HIGH);
}

void loop() {
  if(digitalRead(buttons[0])==HIGH && !lastUpButtonState){
    if(value<5) value++;

    lastUpButtonState=true;
  }else if(digitalRead(buttons[0])==LOW){
    lastUpButtonState=false;
  }
  if(digitalRead(buttons[1])==HIGH && !lastDownButtonState){
    if(value>1) value--;
    lastDownButtonState=true;
  }else if(digitalRead(buttons[1])==LOW){
    lastDownButtonState=false;
  }

  if(value==1){
    digitalWrite(CFG[0],HIGH);
  }else{
    digitalWrite(CFG[0],LOW);
  }
  if(value==4||value==5){
    digitalWrite(CFG[1],HIGH);
  }else{
    digitalWrite(CFG[1],LOW);
  }
  if(value==3||value==4){
    digitalWrite(CFG[2],HIGH);
  }else{
    digitalWrite(CFG[2],LOW);
  }
  analogWrite(SIG,values[value]);
}

ここまでで typeC から任意の電圧を取り出せたのですがロジック回路の方は 5V で動かしたかったのでトランジスタなどを使ってなんとかしようとした。(この回路の実験中に何個か IC を燃やしてしまった) しかし、CH224K のテスト中に使用していた 48M05F がたまたま約 5V を取得できるたためこれを使用した。しかし 3 端子レギュレータがとても暑くなるためこれも物理部に転がっていたヒートシンクを取り付けた。

書き込み回路

書き込み回路にはCH340Eを使用した(チップが小さくてハンダ付けに苦労した)。しかし、買い出しのときにミスってCH340Kを買ってしまい書き込みができなかった。最終的に書き込み回路は以下のようになった。

結局文化祭までには間に合わず、書き込み装置経由の書き込みは諦めることにした。

増幅回路

Arduino を自作するにあたって今まで本家を使っていて一番困ったモーター制御を楽にしたいということから増幅回路を積みました。具体的には ATMEGA328P では各ピンの出力がそれぞれ最大 40mA となっておりこのままモーターなどを回そうとすると壊れるので入力電圧で最大 1A(全体が超えていなければ)に対応できるようにしました。しかし増幅すると波形がなまってしまったので(、あとボードの面積がなくなったので)本体ではなくシールド側につけました。

これについても時間がなく、はんだ付けが間に合わなかったため作ってはいない。

最後に

部活で作った自作 Arduino に付いて解説しました。

参考資料

次へAPCの部誌執筆を支える技術>
前へ猫でもわかる電工班>