OpenMVと通信をした
🎄

OpenMVと通信をした

Tags
Published
November 14, 2018

OpenMVと通信をした

コードを載せておきます。
#include "mbed.h" Serial pc(PA_2,USBRX); RawSerial CAM(NC,PB_7);//OpenMV DigitalOut init(PC_5); uint8_t data_length;//データの長さ char head;//最初の文字 uint16_t data;//データ uint8_t highbyte,lowbyte; void receive(){//シリアル割り込み if(data_length == 0) {//ヘッダ(C)の受信 head = CAM.getc(); if(head == 'C') { data_length += 1; init = 0; }else{ data_length = 0; } }else if(data_length == 1) {//上バイト受信 highbyte = CAM.getc(); data_length += 1; }else if(data_length == 2) {//下バイト受信 lowbyte = CAM.getc(); //data = highbyte*256 + lowbyte; //復元 data = (lowbyte<<8)|highbyte;//ビット演算 data_length = 0; } } void get(){ init = 0; wait_us(3); init = 1; } int main(){ pc.baud(230400); CAM.baud(230400); CAM.attach(&receive,Serial::RxIrq); data_length = 0; init.write(0); while(1) { get(); wait_ms(1); pc.printf("data:%d \t highbyte:%d \t lowbyte:%d\n",data,highbyte,lowbyte); } }
ヘッダ文字Cを受信したらデータの順番が正しいことになるから次からくるデータを読み込むっていうプログラムを書いています。何が便利かと言いますと、ケーブルが切り離されたときに普通に読み込んだらデータの順番がぐちゃぐちゃになる可能性があります。それを正すためにC以外のモージが送られてきたらそのデータはパスして正しい順番へと導きます。まあ我ながらなかなかいいアルゴリズムだと思います。
get();はデジタルピンをHIGHにするだけです。この関数を実行するとOpenMVがそれを感知し、データを送信し始めます。
データがOpenMVから送られてくるとシリアル割り込みでreceive();が呼び出されます。
この関数でデータの読み込みや、データ整形を行います。
そろそろ抽象化をかまし始めましょうかね。明日はラインセンサを作ります。

Loading Comments...