n_shinichi’s blog

日々の備忘録、 趣味のあれこれなど紹介 (すみません、メニュー、リンク、カテゴリー分けがうまくできてません、★記事一覧★で見てください...) NHK魔改造の夜ではDンソーのベテランアドバイザーってことで出ました♪

MENU

マイクロライントレーサー ちょっとづつ改良 シリアルチェックサムが???

先回の時とパっと見では代わり映えはないけど、、、

 スケッチの中身をだいぶ整理した。

 

でもってPID制御・・・じゃなくてPD制御、ライントレースはある程度ズレたまま

 でも気にしないので I はあまり意識して使わない。

 P、D、FB周期とかをライントレースしながら変更できるようにした。

 

動きからは全くわからんですが

 なぞのバグのパッチあてをある程度直したり。。。

 

最近はちょっとやばいかもってのが、

 C言語の基本・・・?をだいぶ忘れていい加減になってきてる。

 特にArduino、ESP32を使いだしてから加速した...

Arduino言語

  プロトタイプ宣言せんでもいいとかいろいろ初心者に

  使いやすいようにしてる あれがほんと使いやすい。

 

ほとんどパソコンのプログラム・・・

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("Hello, World!");
}

マイコンではお約束の面倒なおまじないが全くない。。。

 

型の感覚がなくなってきてる。

 格安なのに高性能なESP32、

  浮動小数点の演算が整数演算とほとんど変わらん速さ。 すごい。

  物理値そのもので計算が一瞬。

 30年前、車のエンジン制御のソフトの開発溶かしてた時 思い出す。

  割り算は使っちゃいけない、いかに8ビットで収まるか

   物理値のLSB・・・この言い方は変だけどの設定がキモで

   いかにマイコンにやさしい演算に置き換えるかに神経使った。

 そんなマイコン使ってた時は倒立振子ロボなんかも

  PID制御そのものよりマイコンにうまく演算させるのを考える方が大変だった。

 

で・・・なぜかシリアルのチェックサム

  なんも難しいことしようとしてないんだけど・・・

  なんか変だった。合計が127以下じゃないといかん???

  なんでint8_tの正数側だけ???

 

 

結局 落ち着いたのは

 こんな感じ

 

M5,ATtinyどっちも配列はこれ

int8_t Rx_data[10],      Tx_data[10];
byte  Rx_data_temp[10], Tx_data_temp[10];

 

◆M5 から ATtiny への 赤外線シリアル送信

//////////////////////////////////

M5の送信スケッチのチェックサム

void send_Tx_data(){
    Tx_data_temp[0] = Tx_data[0];
    Tx_data_temp[1] = Tx_data[1];
    Tx_data_temp[2] = Tx_data[0] + Tx_data[1]; 
    Serial1.write(Tx_data_temp, 3); 
    Serial1.flush(); 
}

//////////////////////////////////

ATtinyの受信スケッチのチェックサム

     if( Rx_data[2] == (Rx_data[0]+Rx_data[1])){

    ・・・・・  

 }

//////////////////////////////////

 

◆ATtiny から M5 への 赤外線シリアル送信

//////////////////////////////////

ATtinyの送信チェックサム

void send_Tx_data(){
    Tx_data_temp[0] = (byte)Tx_data[0];
    Tx_data_temp[1] = (byte)Tx_data[1];
    Tx_data_temp[2] = (byte)Tx_data[0] + (byte)Tx_data[1];  
    Serial.write(Tx_data_temp, 3); 
    Serial.flush(); 
}

//////////////////////////////////

M5の受信スケッチのチェックサム

if( (uint8_t)Rx_data[2] == *1{

・・・・

}

 


M5からATtinyへの通信は何も特に考えることなくできてた。

で、、、

ATtinyからM5も同じで行けると思ったらいけない 

  なんでだー???? でした、

 

 本質的にはなんか別のとこに勘違い、間違いがあるのかなとも

  思うけど、

  なぜかATtinyから送る時には(byte)型キャスト付けてチェックサムつけて、

  M5で受ける時には(uint8_t)で型キャストしてチェックサムの確認したら

 うまく行くようになった。

 

これ見て、何を間違ってるとか

 なんでそうせんといかんのかご存じの方いましたら

  ご一報いただければ幸いです。

 

 

 

 

 

 

 

 

 

 

 

 

*1:uint8_t)Rx_data[0]+(uint8_t)Rx_data[1]