# 卒研経過報告(Eチーム) #8
タンジブルなプログラミングデバイスCU-Brick(キューブリック)に関する研究
team member : 子安,鈴木,堀
GitHub : https://github.com/KoyasuJunya/cu-brick-tangible-master
先週のメモ:https://hackmd.io/wIJjRsP6TBKLPsVLftcpaw
# 実験日:6月19日(土)
6月22日発表分
## 前回までと今回やること
* 前回はv1,v2のブロックの抵抗値を計測し、そこでv1では予想通りの抵抗値が現れるのに対し、なぜかV2ではおかしな数値が現れることが分かった。そこで今回は、問題を細分化し、まずは一つのマスの抵抗値を読みとるプログラムを作成し、計測を行う。そこで問題がないようならマスを増やしていき計測の結果から原因を考える。
## 1つのマスの抵抗値を読み取るプログラムの作成
```c=
//ブロック読み取り データ送信プログラム
#include "MicroBit.h"
#include "../../Common.h"
//マルチプレクサで読み取るピンの個数
#define MUX_READ 4
//読み取りボタンインスタンスのID
#define ID_READ_BUTTON 10
MicroBit uBit;
//読み取りボタンインスタンスの作成
MicroBitButton readButton(MICROBIT_PIN_P19, ID_READ_BUTTON, MICROBIT_BUTTON_ALL_EVENTS, PullUp);
uint8_t board[TATE][YOKO];
uint8_t labelCount; //カウント用
uint8_t sendStat; //データ送信の段階
bool sendReady; //送信可能フラグ
Label labels[SUB + 1]; //座標保存用変数
//値変換
uint8_t SetNum(int blockNum){
if(blockNum <= 10){
return 0;
}else if(blockNum <= 38 && blockNum >= 11){
return 193; //的が倒れた?
}else if(blockNum <= 55 && blockNum >= 39){
return 64; //開始ブロック
}else if(blockNum <= 83 && blockNum >= 56){
return 65; //うさぎ(ラベル)
}else if(blockNum <= 101 && blockNum >= 84){
return 129; //うさぎ(呼出)
}else if(blockNum <= 128 && blockNum >= 102){
return 67; //パンダ(ラベル)
}else if(blockNum <= 167 && blockNum >= 129){
return 131; //パンダ(呼出)
}else if(blockNum <= 217 && blockNum >= 168){
return 8; //低い音
}else if(blockNum <= 244 && blockNum >= 218){
return 4; //バツ表示
}else if(blockNum <= 375 && blockNum >= 245){
return 194; //全部倒れた?
}else if(blockNum <= 400 && blockNum >= 376){
return 1; //ハート表示
}else if(blockNum <= 426 && blockNum >= 401){
return 2; //小ハート表示
}else if(blockNum <= 489 && blockNum >= 427){
return 7; //高い音
}else if(blockNum <= 583 && blockNum >= 490){
return 3; //マル表示
}
}
//読み取り
void Read(){
//トランジスタのベースへつながるピン
MicroBitPin digitalOut[YOKO] = {uBit.io.P5, uBit.io.P6, uBit.io.P7, uBit.io.P8, uBit.io.P9, uBit.io.P11, uBit.io.P13};
//読み取りピン
static MicroBitPin analogRead[TATE - MUX_READ] = {uBit.io.P3, uBit.io.P0, uBit.io.P4, uBit.io.P1, uBit.io.P10};
MicroBitPin muxControl[3] = {uBit.io.P14, uBit.io.P15, uBit.io.P16}; //マルチプレクサ操作用ピン
static MicroBitPin muxRead = uBit.io.P2; //マルチプレクサで読み取るピン
for(int i = 0; i < YOKO; i++) digitalOut[i].setDigitalValue(0);
//ここから読み取り
for(int i = 0; i <= 6/*YOKO*/; i++){
digitalOut[i].setDigitalValue(1);
for(int j = 0; j < TATE - MUX_READ; j++) board[j][i] = SetNum(analogRead[j].getAnalogValue());
//これ以降はマルチプレクサで読み取る
for(int j = 0; j <= 5/*MUX_READ*/; j++){
for(int k = 0; k < 3; k++) muxControl[k].setDigitalValue((j >> k) & 1);
board[j + MUX_READ + 1][i] = SetNum(muxRead.getAnalogValue());
}
digitalOut[i].setDigitalValue(0);
}
}
//ボタンが押された際に実行され,ボードの読み取り,座標情報の記録を行った後にデータ送信へと移る
void OnButton(MicroBitEvent){
//ディスプレイを無効化して使用されている端子を読み取りで使用できるようにする
uBit.display.disable();
Read();
uBit.display.enable();
//値を表示(デバッグ用)
for(int i = 0; i <= 5/*TATE*/; i++){
for(int j = 0; j <= 6/*YOKO*/; j++){
if(board[i][j] < 10){
uBit.serial.send(" ");
}else if(board[i][j] < 100){
uBit.serial.send(" ");
}else{
uBit.serial.send(" ");
}
uBit.serial.send(board[i][j]);
}
uBit.serial.send("\r\n\r\n");
}
uBit.serial.send("-----------------------------------------------------");
uBit.serial.send("\r\n\r\n");
labelCount = 0;
//ラベルの数をカウントして座標を記録
for(int i = 0; i < TATE; i++){
for(int j = 0; j < YOKO; j++) if(board[i][j] >> 6 == 1){
//読み取りに失敗して異常な数のラベルブロックが検出されたらエラーで終了
if(labelCount >= SUB + 1){
uBit.display.printAsync(sad);
return;
}
labels[labelCount++].SetLabel(i, j, board[i][j] & 0b00011111);
}
}
}
int main(){
uBit.init();
//無線,ボタンのイベントハンドラ有効化
uBit.messageBus.listen(ID_READ_BUTTON, MICROBIT_BUTTON_EVT_CLICK, OnButton, MESSAGE_BUS_LISTENER_DROP_IF_BUSY);
uBit.radio.setGroup(CHANNEL);
uBit.radio.enable();
while(true){
uBit.sleep(1000);
}
}
```
## 環境
今回は上に載せたプログラムを使用している。このプログラムは前回使用したsendのプログラムから通信の部分を削除したプログラムである。
抵抗値の読み取る数は読み取りの部分を修正して変更する。
またブロックは左端にスタートブロック、他はハートのブロックを使用することとする。
### 1. 列を増やす
まずは1つだけ表示し、問題が無いようなら列を増やしていく
これをハードウェアの限界の列である7まで行う
〇結果
 

上の画像は抵抗値が1つだけのとき、2つのとき、端の列までのときの抵抗値である。
まず前提として左端にスタートブロック、他は右端までハートブロックを使用している。そのため、左端が64、他は2が表示されるはずである。しかし図を見るとわかるように1という違うブロックの抵抗値が返されることや0が表示されることがあった。ただ前回のようなreturnで設定していない全く想定していない数字が出ることはなかった。
### 2. 次に行を増やす
これをハードウェアの限界の行である9まで行う
〇結果
 
上の画像は行を増やしたものである。
まず、この計測のブロックは1.のときと同じ並べ方で行っている。
6行目の値までは列の場合と同じような結果になったが、6行目以降を表示するようにするとreturnで設定していない全く想定していない数字が表れるようになった。
〇考察
以上のことから6行目までは抵抗値の誤差はあるが想定の範囲内であることが分かった。次はこの設定していない数値が何なのかを調べる。
### 3. 抵抗値(変換前)の計測
```c=
uint8_t SetNum(int blockNum){
return blockNum;
}
```
受け取った抵抗値を調べる為、戻り値をすべてblocNumに変更し実験を行った。一行のみを抽出し抵抗値をそれぞれ調べる。
* v2の結果

* v1の結果

与えられた抵抗値を確認するとv2,v1に大きな違いがないことが確認できるが、それぞれ値が正しく読み取れていない事がある。
### 4. どこにも該当しない抵抗値
前回表示されたどのブロックにも該当しない値を調べる為、以下のコードを挿入した。
```c=
uint8_t SetNum(int blockNum){
if(blockNum <= 10){
return 0;
}else if(blockNum <= 400 && blockNum >= 376){
return 1; //ハート表示
}else if(blockNum <= 426 && blockNum >= 401){
return 2; //小ハート表示
/*中略*/
}else{
return 99;
}
}
```

上記のようにブロックに設定されていない値が表れてることが分かった。
## まとめ
今回はまず最初に1か所での抵抗値の計測を行った。その結果としては1つだけの場合ではたまに抵抗値を読み取れていないのか0が表示されることがあったが他は想定した通りの抵抗値が返されていた。そのあとに、列を端の列まで増やしたとしても抵抗値の誤差はあるもののおかしな抵抗値は表示されなかった。
行を増やした場合は、最初のうちは列と同じで問題なく動いていたが6行目以降を表示しようとするとおかしな抵抗値が表示されていた。
ここまでの結果からプログラムで処理をする量が増えると返す抵抗値が正確ではなくなってしまうのではないかと考えた。
次にこのおかしな抵抗値が何なのかについて調べた。
結果として、このおかしな抵抗値はプログラム内で設定されている抵抗値ではない値だということが分かった。
また、前回の実験でV1では抵抗値が安定していたがV2では安定していないことが分かっていたが、今回の実験3である抵抗値(変換前)の計測では、V1もV2も特に大きな違いは見当たらなかった。したがって、ただ単に抵抗値(変換前)を読み取るという点ではv1,v2ともに大きな違いが見られなかったことから、問題はマイコンにデータを送るところではない他の部分にあると考えられる。
以上のことから前回表示されたおかしな数値はプログラムで想定していない数値だということが分かった。また、V2でおかしな抵抗値が表示される原因として、プログラムで処理をする量が増えるとブロックの抵抗値を正しく読み取れなくなり抵抗値がおかしくなるのではないかと考えた。ただ、結局のところなぜ全く同じプログラムを使用しているのに、V1では問題なく動くのかは分からなかった。違うところといえば容量に関する部分かとも考えたがV2の方がV1よりも容量が大きいはずなのに、プログラムの処理が大きいものはV1でだけ正しく動きV2では正しくは動かないというところから容量も関係ないのではないかと考えた。
[](修正前、コメントアウト\
また、前回の実験でV1では抵抗値が安定していたがV2では安定していないことが分かっていたが、今回の実験3である抵抗値(変換前)の計測では、V1もV2も特に大きな違いは見当たらなかった。そこで前回の実験は不具合でもあったのかと思いもう一度同じことを試したがやはりV1は安定し、V2は安定しなかった。)
## 次回の目標
今回の実験で変換前の抵抗値の値が安定しないため変換後の抵抗値の値が安定しないことや、プログラムの処理が大きく、そこが原因で最初は正しい値を送れていてもだんだんとマイコンに正しい値が送れていないのではないかということが考えられた。
この結果から次回はどうすれば抵抗値が安定するのかについてと、プログラムの処理を少なくする方法について考えようと思う。
プログラムの処理が大きいという問題はV1のマイコンでも上がっていた問題で、V1とV2の抵抗値の表示に違いがあるという問題に関しても、処理が小さいプログラムができれば解決することができるかもしれないのでプログラムの処理を小さくするというのを第一優先で進めていこうと思う。
また、V1とV2で抵抗値の表示に違いがあった原因もまだ分かっていないので、この問題についても並行して考えていこうと思う。