ラインカメラをESP-WROOM-32で動かす


あまり早くないICを上手く使いこなすを止めて、早いCPUでサクサク動かす
今回のボードはESP-WROOM-32。
32画素の読み込みだと370us程度、露光時間を1msとすると700Hz以上でサンプリングできそう。
そこまで早いなら、標準的なライントレース制御でもいけるのではないだろうか
適当な画素の値を2値化して出力して、デジタルセンサのポートに繋ぎ、
適当な画素の値をまとめてDACで出力して、アナログセンサのポートに繋げば
そのまま置き換えもできるかもしれない。
といっても、ここからの調整は、実機にカメラと証明を取り付けて現物合わせになるので未検証。

#define CLK 16
#define SI 17
#define AO A0

#define SEN_R 18
#define SEN_MR 19
#define SEN_C 21
#define SEN_ML 22
#define SEN_L 23
#define THER_WHITE 50

#define ANA_R 25
#define ANA_L 26


unsigned char data[32];

void setup() {
  // put your setup code here, to run once:
  
  digitalWrite(SI, LOW);
  pinMode(SI, OUTPUT);
  digitalWrite(CLK, LOW);
  pinMode(CLK, OUTPUT);

  pinMode(SEN_R, OUTPUT);
  pinMode(SEN_MR, OUTPUT);
  pinMode(SEN_C, OUTPUT);
  pinMode(SEN_ML, OUTPUT);
  pinMode(SEN_L, OUTPUT);
  
  pinMode(ANA_R, OUTPUT);
  pinMode(ANA_L, OUTPUT);

  
  Serial.begin(115200);
  while (!Serial);
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(500);
  
  while(1)
  {
    digitalWrite(SI, HIGH);
    digitalWrite(CLK, HIGH);
    digitalWrite(SI, LOW);
    delayMicroseconds(10);
  
    digitalWrite(CLK, LOW);
    for (int j = 0; j < 32; j++){
      data[j]=analogRead(A0)/4;//12bit -> 10bit
      digitalWrite(CLK, HIGH);
      digitalWrite(CLK, LOW);
      digitalWrite(CLK, HIGH);
      digitalWrite(CLK, LOW);
      digitalWrite(CLK, HIGH);
      digitalWrite(CLK, LOW);
      digitalWrite(CLK, HIGH);
      digitalWrite(CLK, LOW);
    }
    
    dacWrite(ANA_R, (data[12]+ data[13]+ data[14])/12);  //data[x]は最大1024までになる
    dacWrite(ANA_L, (data[18]+ data[19]+ data[20])/12);  //DAC は8bit(最大255まで)なので、溢れないよう注意
    
    if(data[ 5]>THER_WHITE){digitalWrite(SEN_R , HIGH);}else{digitalWrite(SEN_R , LOW);}//右端センサ
    if(data[ 8]>THER_WHITE){digitalWrite(SEN_MR, HIGH);}else{digitalWrite(SEN_MR, LOW);}//右中センサ
    if(data[16]>THER_WHITE){digitalWrite(SEN_C , HIGH);}else{digitalWrite(SEN_C , LOW);}//中心センサ
    if(data[24]>THER_WHITE){digitalWrite(SEN_ML, HIGH);}else{digitalWrite(SEN_ML, LOW);}//左中センサ
    if(data[27]>THER_WHITE){digitalWrite(SEN_L , HIGH);}else{digitalWrite(SEN_L , LOW);}//左端センサ
  
    
    //Serial.println (data[15]);
    delay(5);//ココで露光時間調整
  }

}

カテゴリー: RMCR 2017 | コメントする

RMCR2017夏


今回は日程の関係か参加台数は少なめだが、マスタークラスが新設されたRMCR
いつもの連中は自由にやらせといて、Advanceクラスを一新する良い変更だと思う。

さて、競技結果は、
予選を2位で通過するも
決勝Tでは、パターン剥離で走行できず。残念
常に監視していた箇所なのだけど、まさか本番で壊れるとは

築地でご飯


カテゴリー: RMCR 2017 | コメントする

三日目


佐野工科さんに新コースのこけら落としにお邪魔する
公式より精度の高そうな、凄い加工で作られたコースだった。
夏の期間に走りこんで、地区大会に臨むようだ

前日作ったバッテリを使ってみるも、タイム差は無し。
電流を引かない(引けない)標準モータでは、放電特性の影響は微小のようだ
(バッテリは劣化してなければ、わりと何でも良いのではないかと思う)

カテゴリー: RMCR 2017 | コメントする

二日目


鈴鹿に向けて大忙しの紀北工業さんへ
スイカウマイ

徐々にパラメータを開放させて、確認を進める
・左斜線変更の区間直後にコーナがある場合に対応できないバグを見つけて修正。
・よさげなピニオンを試してみる。あまり走行音は変わらないそう
・重いバッテリを求めて、エネループプロを組電池化をさせて頂く
 ニッケルタブのスポット溶接はなかなか怖い

カテゴリー: RMCR 2017 | コメントする

半年振り


春の大会以来、久々にマシンを搬送箱から出す。
管理を忘れていたバッテリは、予備も含めて故障していた。

さすがに未調整は不味いと、淀工さんに
半年ぶりに、操作方法を思い出して、走らすと
無事完走できて、まずは一安心。

次に動きを見ていると、何か音がおかしい。
右後輪が派手にトーアウトになっていた。
春の大会の大クラッシュ時にシャフトが曲がっていたようだ。

エンコーダを固定している樹脂バネも劣化していたようで
すぐに割れてしまった。予備を準備しとかねば。

カテゴリー: RMCR 2017 | コメントする

関西地区大会


最短走行できず。
まさかのゴール区間に壁を置いている。
斜め走行の調整より先に、探索をどうにかしないと。

カテゴリー: マイクロマウス | コメントする

こつこつ


急ぎ組み立てる
致命的なミスは無さそうだが
・ギヤボックスはPOMで作り直したい(壊れたら置き換える)
・ピニオンは厚さ1mm位で良い(要発注)

カテゴリー: マイクロマウス | こつこつ はコメントを受け付けていません。

PCBGOGOから基板が届く


PCBGOGOさんから基板が届く、
紫や、つや無し黒のレジスト色が選べて、安くて、早い
5/7(日) 見積もり
5/8(月)朝 ガーバ確認完了
5/8(月)夜 入金
5/9(火)朝 入金確認
5/13(土)朝 出荷
5/15(月) 着

データはPCBEで、この手順で作成したもので問題なかった。

//////////
スルーホールはティアドロップ処理したが良さそう
穴0.3mm ランド0.7mmだと穴ズレがちょっと不安

カテゴリー: マイクロマウス | PCBGOGOから基板が届く はコメントを受け付けていません。

どたばた


マイクロマウス関西支部総会がGW前に行われ
7月9日(日)に行われる関西地区大会の計画を立てる

完全に大会時季を忘れていた
とにかく、32×32の迷路を走れる機体を作らねば
基礎となるソースコードの入手や、在庫整理と追加注文、アートワークやらを進める。
仕様も割り切る
マイコンはRX631の64pin、リポ1セル、ジャイロは今回はアナログ、壁センサはφ③3に変更、エンコーダは使いまわす。

/////
・digkey,マルツの1回目発注完
・PCBガーバ確認返信待ち

カテゴリー: マイクロマウス | どたばた はコメントを受け付けていません。

R8C側に続く

実機が無いので、確認しようが無いがR8C側の受信処理検討。
こんな感じの接続を想定

プロトタイプ宣言に追加

void CamCommProcess( void );

グローバル変数追加

/* カメラとの通信用等*/
unsigned char cam_read_u ; /* 同期信号上りエッジフラグ保存用 */
unsigned char cam_trace ; /* トレースデータ保存用 */

関数を追加する(P7_0とP7_1がデジタルとして取得できるかは未確認)

void CamCommProcess( void )
{
 unsigned char cam_tmp=0;
 /*センサデータ取得(トレース) 上りエッジ*/
 if(cam_read_u==1 && (p0_3 & 0x01)==0x00 ){cam_read_u=0;}
 if(cam_read_u==0 && (p0_3 & 0x01)==0x01 ){//ポート0 bit3の立上りで取り込み
 cam_read_u=1;
 
 cam_tmp= (p1_6 & 0x01) + (p1_7 & 0x01)*2 + (p7_0 & 0x01)*4 + (p7_1 & 0x01)*8 +
 (p0_0 & 0x01)*16 + (p0_1 & 0x01)*32;
 
 cam_trace=cam_tmp;
 }
}

mainループで関数を常に呼ぶ。

while( 1 ) {

CamCommProcess();

switch( pattern ) {

getAnalogSensor関数を書き換える

int getAnalogSensor( void )
{
    int ret;

    if(cam_trace!=63){
        ret = cam_trace - 31 ;//中心が31の場合
    }else{
        ret = 0;//とりあえず今回は0にしておく
    }
    
    if( !crank_mode ) {
        //なんか処理追加
    }

    return ret;
}
カテゴリー: RMCR 2017 | R8C側に続く はコメントを受け付けていません。