# 卒業研究経過報告(Eチーム)#13
メンバー:鈴木,堀
[前回のメモ](https://hackmd.io/Fs3QOlPBS3OLIVDMWmGPiw)
[前回の先生のメモ](https://hackmd.io/@okuisatoshi/r1KXIyPGF)
## 目標
卒論の主張の柱 先行研究(田中先輩)と比較して以下の利点を主張 分圧測定のマトリックス回路を再設計し1マスずつ電流を流して測定するようにしたことで以下の利点を得た.
消費電力が小さくなり、バッテリーの稼働時間が伸びた
稼働するための電流が小さくですむ(1/7〜1/9程度)のでトランジスタが不要になった
旧回路ではブロックをたくさん並べたときに過負荷(十分な電流を流せない)になり分圧の測定値に大きな誤差がでる欠点があった(杉山先輩の論文参照)が、これが改善された
・執筆と並行して以下の残された課題に取り組む
設計した回路を実際に組んで,上記の利点を実験(計測)で客観的に実証する.
## 今回やること
1. マルチプレクサについて調べる
2. 実際にマルチプレクサを使用して回路の作成
## マルチプレクサについて
マルチプレクサとは、2つ以上の入力を1つの信号として出力するための機構のことをいい、種類が色々とある。
### 使用するマルチプレクサ
今後はとりあえず、先輩の使用していた74HC4051APというマルチプレクサを使用していく。

### 74HC4051APについて
これはCMOS技術を用いたアナログマルチプレクサで、アナログ、デジタル信号を高速でスイッチングすることが出来るのが特徴。


上の写真は74HC4051APのpinの役割についての物である。また1つ下の写真は回路を組むにあたって参考にしたものである。
今回は縦列を読み取るマルチプレクサは、操作用pinとしてs0, s1, s2をデジタルpinの14, 15, 16に、Vccを3.3Vに、zをアナログpinの2pinに接続し、y2, y1, y0, y3を縦列用の4つに使用している。
また、横列を読み取るマルチプレクサは、操作用pinとしてs0, s1, s2をデジタルpinの12, 11, 9に、y2, y1, y0, y3を横列用の4つに、zを基準抵抗につなげている。
## 実験
### 回路

今回は上の回路図をブレッドボード上で再現する。
この回路で使われている抵抗は左の1列から220, 6800, 2200, 510の順で設置している。また、基準抵抗は510を使用している。

線がかなりややこしくて見づらいが上の写真がブレッドボード上で再現したものである。
### プログラム
今回書いたプログラムは以下である。
```c++=
#include"MicroBit.h"
#define TATE 4
#define YOKO 4
#define ID_READ_BUTTON 10
int n = 0;
//読み取りボタンインスタンスのID7
#define MUX_READ 4
//マルチプレクサで拡張するピンの数
uint16_t board[TATE][YOKO];
MicroBit uBit;
MicroBitButton readButton(MICROBIT_PIN_P19, ID_READ_BUTTON, MICROBIT_BUTTON_ALL_EVENTS, PullUp);
//読み取りルーチン
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();
}
}
}
//読み取りボタン押されたら実行
void OnButton(MicroBitEvent){
n = 0;
uBit.display.disable();
read();
uBit.display.enable();
//値を表示(デバッグ用)
for(int i=0; i < TATE; i++){
for(int j=0; j <YOKO; j++){
if(board[i][j]<10){
uBit.serial.send(" ");
}else if(board[i][j] < 100){
uBit.serial.send(" ");
}else if(board[i][j] < 1000){
uBit.serial.send(" ");
}else{
uBit.serial.send(" ");
}
uBit.serial.send(board[i][j]);
n++;
}
uBit.serial.send("\r\n\r\n");
}
uBit.serial.send("------------------------------------------------------");
uBit.serial.send("\r\n\r\n");
}
int main(){
uBit.init();
uBit.messageBus.listen(ID_READ_BUTTON, MICROBIT_BUTTON_EVT_CLICK,OnButton, MESSAGE_BUS_LISTENER_DROP_IF_BUSY);
while(true){
uBit.sleep(1000);
}
}
```
今回はマルチプレクサを二つ使用して分圧を計測した。そのため前回使用していたプログラムの読み取り部分を大幅に改変し、マルチプレクサへのピンの割り当てや読み取り操作を行うプログラムに変えた。しかしまだマルチプレクサに対する理解が浅く、先輩のソースなどを参考にしつつコードを書いたので理想の値を得られる確証がない状態。
| 理想の値 | | | |
| ---- | ----- | ----- | ------- |
| 715 | 715 | 715 | 715 |
| 71 | 71 | 71 | 71 |
| 237 | 237 | 237 | 237 |
| 511 | 511 | 511 | 511 |
上で説明した回路図とプログラムを使用した場合大体この表のように値が表示されれば成功したと言える。
## 結果

## 考察
結果を見ると理想の値とは違う値が出てしまっていることが分かる。しかし横向きの行で見た場合上の4つ以外の行は比較的まとまった数字になっている。
しかし、原因は調査中
## 今後の課題
* 一度縮小化し、2×2の回路でマルチプレクサを使い、実験を行う。
* 回路図を見直す(特にマルチプレクサ周辺)
* マルチプレクサに読み取りを指示する部分を重点的に、プログラムを見直す
## 参考文献
[74HC4051APの仕様書](https://www.chip1stop.com/pdf/product/TOSH/TC74HC4051AF_TC74HC4053AP_JA_DATASHEET_071001.PDF)