情報技術科 No.36 宮地智羽
①研究の背景
現在部活動で行っているMCR(マイコンカーラリー)の車体がどのように動いているのか把握するためにロガーを作成する
MCRとはマイコンを搭載したライントレース車体によるレースのことである。コースに貼られた白線をセンサーで読み取り、なぞって走る。コースは直線、カーブやクランク(直角カーブ)、レーンチェンジ、坂などで構成される。
車体の形、プログラム等によってタイムに差がでるため、各々工夫し、戦略をたててレースへ挑む。
コースを完走しタイムを縮めるためのプログラミングには走行中の状態を知ることが必須となる。そのため、普段私たちは車体の動きを動画やSDカードに記録されるログから確認をしている。このSDカードのログ(以下、現ログ)について下記のような問題が部内で話し合われていた。
- 取得できるデータ量に制限がある
- データの取得頻度がすくない
- 記録に失敗することがある
これらを解決したログを作成し、知的制御研究部マイコンカーAnalogAdvance部門全体で能力向上を目指す。
②仮説とねらい
マイコンカーは車体各部のセンサーから得たデータでマイコンが車体の状態を判断し、モーターへPWM制御をかけている。この流れにおいて、マイコンのピン端子に信号が流れている。この信号を取得し、保存することができればログが作成できると考えられる。
現ログについて改めて確認する。
- CSVファイルをSDカードに作成
- 10msごとに1行分64文字をCSVファイルに書き込むことが可能
上述の問題の1、2を解決するために現ログ以上の書き込み速度をもつロガーを作る必要がある。
上述の問題の3、記録に失敗する理由については走行と現ログの書き込みを1つのマイコンで制御していることで悪影響が起こっているのではないかと考えられている。そのため、ロガーは走行制御に関わらない独立したものとして作る必要がある。
③研究内容
走行の制御をしているマイコン(以下、主マイコン)のピン端子からデータを取得し、RAMを取り付けた別のマイコン(以下、子マイコン)に保存する。子マイコンとしてロガーの機能を独立化することで問題3をクリアする。
主マイコンと子マイコンに同じマイコンを使用することでピン端子の配置が同じとなりピギーバックで接続するだけでセンサーの値を取得可能になる。また、PWM信号は積分回路を通し、アナログ信号ピンから取得する。
子マイコンとRAMはSPI通信でデータの書き込み、読み出しをする。
他の部員にも使用できるロガーとするためデータ読み出し用のデスクトップアプリケーションを作成する。
④技術的知識
Serial Peripheral Interface(SPI)
マイコンと周辺機器の接続によく用いられるシリアル通信の1種
I2Cよりも高い周波数に対応
4本(SCK,MISO,MOSI,SS)の信号線がある
SCK[Serial Clock]
シリアル信号を送るための線
MISO[Master In Slave Out]
スレーブから出力してマスタに入力するための線
MOSI[Master Out Slave In]
マスタから出力してマスタに入力するための線
SS(CS)[Slave Select(チップセレクト)]
マスタがスレーブを選択するための線
(一つのデバイスの場合は固定できる)
1つのマスタで1つ以上のスレーブが操作できる(今回の場合、マスタがマイコン、スレーブがRAMとなる)
ほとんどのスレーブ装置はデバイスが選択されていないときMISOがハイインピーダンスとなっている(トライステートを使う)
1.マスタがスレーブのサポートする周波数のクロック信号を生成する
2.マスタが該当スレーブのSS線の論理レベルを0にすることで通信するスレーブを選択する
3.各クロックの間に
マスタがMOSI線上に1bit送信、スレーブが読み込む
スレーブがMISO線上に1bit送信、マスタが読み込む
通常、送信には特定のサイズの2つのシフトレジスタが用いられていて、1つはマスタ、もう1つはスレーブに配置される
これらのレジスタは仮想的にリング状として接続されている
クロックエッジでマスタとスレーブの両方がbitをシフトアウトする(どちらかがダミーデータなこともある)
データは通常、最上位ビットが最初にシフトアウトされる
次のクロックエッジでサンプリングされシフトレジスタの新しい最下位ビットとして設定
4.全ビットがシフトインシフトアウトするとマスタとスレーブはレジスタ値を交換した状態になる。
5.さらにデータを交換するならシフトレジスタがリロード、一連の処理を繰り返し
完了するとマスタがクロック信号を停止、通常はスレーブ選択を解除する
専用の周辺回路(シフトレジスタのような)を使うSPI通信をハードウェアSPIといい、
GPIOを使いソフトウェアで信号を生成する方式をソフトウェアSPIという。
上記の図で説明するとMOSI、MISOをそれぞれ最下位ビットから最上位ビットに接続し、右シフトしていくことでデータ通信を行う。
図や今回の研究のようにマイコンとRAMの1対1の通信の場合は信号線SSは不要である。
RAM[Random Access Memory]
RAMは書き込み速度が速いため、問題1、2の解決のため今回利用することとする。
SRAM[Serial RAM]
DRAM[Dynamic RAM]などであればデータを記録し続けるためにはリフレッシュという操作が必要だが、SRAMであれば不要である
しかし、揮発性メモリではあるため電源供給が止まればデータは基本は消える。
今回は仮作成時の子マイコンで23LC512を使用する。
FRAM[Ferroelectric RAM]
強誘電体メモリ[FeRAM]が正式名称でFRAMは商標である
こちらもリフレッシュが不要だが、不揮発性メモリであるため電源供給が止まってもデータは消えない
また、消費電力が少ないことが特徴
FRAMの不揮発性の記録の原理は強誘電体にある。強誘電体とは絶縁体の分類の一つであり、電界をかけると分極を発生させる。強誘電体の分極は電界を消しても維持される特徴があり、分極の向きを論理値に対応させ記録する。
小型化が課題とされている。
今回はMB85RS2MTAを使用する。上述のSPIで通信可能であり、容量は2Mビット。
WPF(Windows Presentation Foundation)
Microsoftが開発したUIサブシステム。.NET Frameworkに標準搭載され、GUI開発が可能。UI(見た目、外観)とロジックを切り離して開発可能であることが特徴であり、見た目部分をXAML(XMLベースの言語。HTMLに似ている。)、ロジックをC#、VB.NETなど.NET系言語で記述する。今回は後述のMCRLogManeger、MCRLogReaderの作成に使用した。
⑤取り組んだ内容
子マイコンとRAMの接続、積分回路など基板設計は先生に依頼した。
SPI通信を子マイコン側のプログラムで再現し(ソフトウェアSPI)、RAMへの書き込み、読み出しを行う。
1バイト分の書き込みプログラムが下記である。MOSI、MISO、SCKはRAMの対応した端子につながっているピン出力状態を指し、1がhigh、0がlowである。
//1バイト書き込み
void SPI_send_byte( unsigned char data ){
unsigned char bitpoint = 0x80;
while(bitpoint > 0){
MOSI = ((data & bitpoint) != 0);
SCK = 1;
SCK = 0;
bitpoint = bitpoint >> 1;
}
}
//1バイト読み出し
unsigned char SPI_get_byte( void ){
unsigned char bitpoint = 0x80, data = 0;
while(bitpoint > 0){
SCK = 1;
if(MISO){
data = bitpoint | data;
}
SCK = 0;
bitpoint = bitpoint >> 1;
}
return( data );
}
上記のプログラム作成の際、基礎入門 8ピンPICマイコンの使い方がよくわかる本を参考にした
その後先生によるプログラムが下記である。
//プロトタイプ宣言
typedef struct {
unsigned int bit: 1;
} Bit;
union def_byte{
unsigned char Byte; // Dat.Byte
struct {
unsigned char LSB:1;
unsigned char dummy:6;
unsigned char MSB:1; // Dat.Bit.MSB
}Bit;
};
union def_adr{
unsigned long int lword; // def_adr.lword
struct {
unsigned long int adres:24; // def_adr.word.adres
unsigned long int scom:8; // def_adr.word.scom
}word;
struct {
unsigned long int LSB:1; // def_adr.Full_Bit.LSB
unsigned long int dummy_l:22;
unsigned long int MSB:1; // def_adr.Full_Bit.MSB
unsigned long int dummy_h:7;
unsigned long int CSB:1; // def_adr.Full_Bit.CSB
}Full_Bit;
};
union def_adr adrd;
//1バイト書き込み
void SPI_send_byte( unsigned char data ){
int cnt;
union def_byte Dat;
Dat.Byte=data;
for(cnt = 0;cnt < 8;cnt++){
MOSI = Dat.Bit.MSB;
SCK = 1;
SCK = 0;
Dat.Byte = Dat.Byte << 1;
}
}
//1バイト読み出し
unsigned char SPI_get_byte( void ){
int cnt;
unsigned char res;
union def_byte Dat;
for(cnt = 0;cnt < 8;cnt++){
SCK = 1;
Dat.Byte = Dat.Byte<<1;
Dat.Bit.LSB =MISO;
SCK = 0;
}
return( Dat.Byte );
}
現ログではデータを文字として書き込んでいるが、この方式は容量の限られたRAMには使えない。そのため、アナログ赤外線センサー、PWMなどアナログデータを1バイト、デジタル赤外線センサー、モーター回転方向などデジタルデータを1ビットとして8種のデータをまとめ1バイトとする。合計して1行16バイトで書き込む。
SRAMを使用した試作子マイコンで書き込みテストを行った際、16バイトを0.1ms以下で書き込みできることを確認した。これは問題1、2の解決に十分な速度である。
ロガーに関して、基本機能は完成しているが運用テストが時間が足りず行えず、運用方法は未定となっている。
ロガーとパソコンの通信はUARTを用い、自作アプリMCRLogReader(以降MLR)を使用し受信する。
https://hyperts.net/csharp-serial-wpf/ を参考にした。
アプリケーションの流れは
- MLRセレクトボックスからシリアルポートを選択、子マイコンと接続。
- 子マイコンを操作、データ出力を開始。
- MLR画面上部に受信データが1バイトづつ16進数で表示される。
- 受信終了後、出力設定
この設定は外部ファイルに保存するため前回と同様であれば不要である。- 1バイトごとに[1列/8ビットとして8列/非表示]の選択
- 列名
- 出力プレビューをMLR画面下部に表示
- 出力プレビューをCSVファイルとして出力する
CSVファイルをグラフ表示するため作成したアプリMCRLogManeger(以降MLM)。
- グラフの同時複数表示(画面右リストボックスからデータ名をクリック)
- グラフ表示起点変更(グラフ下[<< < 選択行 > >>]をクリック)
- グラフ表示倍率変更(画面右下[X: Y: 倍表示]に入力)
- グラフ色変更(画面右リストボックスから対象データ名を左クリック)
- グラフ該当部分の行データを表示(グラフ描画画面をクリック)
知的制御研究部で使用するパソコンにはExcelなど表計算ソフトが入っておらず、ネット環境も悪かったため、このような形での作成となった。
現ログのCSVファイルにも使用可能なため部員にも使用してもらい高評価を得ている。
⑥まとめ
ロガーの運用までたどり着けなかったのは残念である。計画に時間がかかってしまった上、時間割り振りを間違ったのもある。
しかし、マイコンとRAMの接続段階のプログラムと電気信号がつながる部分やマイコンとパソコンの通信段階について実際に自分で行ってみていろいろとできることを知ったのはよかったと思う。