# 卒業研究経過報告(Eチーム)#14
メンバー:鈴木,堀
[前回のメモ](https://hackmd.io/OpT--WptSOyBaIgwNz1bxw)
## 今回やること
* 前回作成した回路の電流を測定する。(鈴木)
* プログラムを見直す(堀)
## 実験(鈴木)
テスターを使用し、1マスずつの電流を測定する。
先輩の論文ではマルチプレクサは10mAまでしか対応していないと書かれていたため10mA以上ある場合は回路を見直す必要がある。
先輩の作った回路だと

上の計算式から1列に7mAの電流が流れ、これが一気に7列に流れる。つまり7×7=49(mA)という計算式から1度に49mAの電流が流れてしまう恐れがあり、その対策として、先輩はトランジスタを使用していた。
この点を踏まえ自分たちはマルチプレクサを2つ使用し、縦と横(行と列)で1つのマスを読み取ることで電流を抑える。
今回の実験では前回の実験で使用した回路に流れる電流を測定する。




上の計算式は今回使用している抵抗と電圧で電流を求めた場合の式である。
ただ、ここで問題なのは、この計算式を見てみると220Ωの場合そもそも15mAの電流が流れてしまい10mAを超えてしまっている。
そこで74HC4051APの仕様書を見てみると

このように10mAではないことが分かるのでこのまま実験を行った。
オームの法則で計算した結果では理想の値は
| 理想の値(mA)| | | | |
| ---- | ---- | ----- | ----- | ------- |
| 220Ω| 15 | 15 | 15 | 15 |
| 6800Ω| 0.5 | 0.5 | 0.5 | 0.5 |
| 2200Ω| 2 | 2 | 2 | 2 |
| 510Ω| 7 | 7 | 7 | 7 |
このようになる。
## 結果
| 実際の値(mA) | | | | |
| ---- | ---- | ----- | ----- | ------- |
| 220Ω| 0.1 | 0.1 | 0.1 | 0.1 |
| 6800Ω| 0.04 | 0.04 | 0.04 | 0.04 |
| 2200Ω| 0.06 | 0.06 | 0.06 | 0.06 |
| 510Ω| 0.1 | 0.1 | 0.1 | 0.1 |
## 考察
理想の値と実際の値を見比べると実際の値が明らかに少なくなっていることが分かる。こうなった原因が分からなかったため、まずこの値にオームの法則を適応してI×Rを計算すると、
220が0,022V
6800が0,3V
2200が0.132V
510が0.05V
という数値になった。この結果から抵抗に流れるまでに電圧が減っているのではないかと考えマルチプレクサのy2, y1, y0, y3を通った後の電圧を測ってみるとそれぞれ1.0V周辺で、通る前の3,3Vより少なくなっていることが分かった。
このことからマルチプレクサの仕様書をもう少し理解する必要があるのではないかと考える。またマルチプレクサに問題がない場合回路を見直す必要があるのではないかと考察した。
## 実験(堀)
マルチプレクサを使用した4*4の回路で抵抗ごとの正しい値を読み取れるように、前回作成したプログラムを元にピン割り当てと読み取り部分を改良する。
```c++=
//読み取りルーチン
void read(){
static MicroBitPin muxControl[3]={uBit.io.P14, uBit.io.P15,uBit.io.P16};//マルチプレクサ操作用ピン
static MicroBitPin muxRead=uBit.io.P2;//マルチプレクサで読み取るピン
static MicroBitPin muxControl2[3]={uBit.io.P9, uBit.io.P11,uBit.io.P12};//マルチプレクサ操作用ピン
for(int i = 0;i < 3; i++){
muxControl[i].setDigitalValue(0);
muxControl2[i].setDigitalValue(0);
}
//ここから読み取り
for(int i = 0;i < 4; i++){
if(i != 0)muxControl[i-1].setDigitalValue(1);
for(int k = 0;k < 4; k++){
if(k != 0)muxControl2[k-1].setDigitalValue(1);
board[i][k] = muxRead.getAnalogValue();
if(k != 0)muxControl2[k-1].setDigitalValue(0);
}
if(i != 0)muxControl[i-1].setDigitalValue(0);
}
}
```
以下は変更前のコード。上と同じく改良が必要なピン割り当て部分と読み取り部分のみ。
```c++=
//読み取りルーチン
void read(){
static MicroBitPin muxControl[3]={uBit.io.P14, uBit.io.P15,uBit.io.P16};//マルチプレクサ操作用ピン
static MicroBitPin muxRead=uBit.io.P2;//マルチプレクサで読み取るピン
static MicroBitPin muxControl2[3]={uBit.io.P9, uBit.io.P11,uBit.io.P12};//マルチプレクサ操作用ピン
//ここから読み取り
for(int i = 0;i < YOKO; i++){//直接読み取り
for(int j = 0;j < MUX_READ; j++){
for(int k = 0;k < 3; k++){
muxControl[k].setDigitalValue((j >> k) & 1);
}
for(int k = 0;k < 3; k++){
muxControl2[k].setDigitalValue((j >> k) & 1);
}
board[j][i] = muxRead.getAnalogValue();
}
}
}
```
全てのピンにおいて電流が流れないようにし、その後for文二つを組み合わせて16通りの組み合わせで一つずつ抵抗に電流を流すようにプログラムした。
## 結果
電流を流し、計測した値をTeraTermで確認した結果、以下の結果が得られた。

下の表のような値が表示されれば成功。
| 理想の値 | | | | |
| ---- | ---- | ----- | ----- | ------- |
| | 715 | 715 | 715 | 715 |
| | 71 | 71 | 71 | 71 |
| | 237 | 237 | 237 | 237 |
| | 511 | 511 | 511 | 511 |
## 考察
全体的に同じ値が計測され、想定していた値が得られなかった。これには、
* setDigitalValueをうまく扱えておらず、複数の抵抗または回路全体に電流が流れてしまっている
* 適切な場所を読み取れていない
などの原因が考えられ、読み取り部分に改善が必要であることが分かった。
## 次回やること
#### 回路
* 74HC4051APの理解を深める
* 計算、回路の見直し
#### プログラム
* プログラム中のピン割り当てと実際の回路とに差異がないかを確認し、電流の流れを適切に制御する。
* 読み取りプログラムの改良。