RMCR 2017」カテゴリーアーカイブ

修理


ルネサス大会で故障したカメラ基板を新調する。
ワイヤーのはんだ付けランドの強化(スルーホール追加)し
ワイヤー自体も根元を接着剤で補強する
基板レジストは、つや無し黒レジスト
接着用スペースの増加による重量増を板厚変更(1mm->0.6mm)で吸収
結果-0.05gで、重量増無し
(にしてもpcbgogoは早い、火曜に発注で、翌週月曜に届いた)

基板の作成は簡単なのだけど、取り替えた後の光軸の調整が本題で、
目視では、カメラが何処を見ているかは分からないため、
カメラのデータを読み込んでは、レンズと基板位置を指先の感覚でズラして合わせ込んでいくことを、延々、行うことになった
たぶん元に戻ったけれど、走行テストで確認必要

続きを読む

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

ラインカメラを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 | コメントする

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側に続く はコメントを受け付けていません。

続き

・エッジ検出によるライン位置推定
・CPU間用パラレル通信

#define LED 13
#define AO A0
#define SI 11
#define CLK 12

#define BIT_7 9
#define BIT_6 8
#define BIT_5 7
#define BIT_4 6
#define BIT_3 5
#define BIT_2 4
#define BIT_1 3
#define BIT_0 2

//エッジ検出閾値
#define MIN_EDGE 3
unsigned char data[32];

void setup() {
// put your setup code here, to run once:
pinMode(LED, OUTPUT);

digitalWrite(SI, LOW);
pinMode(SI, OUTPUT);
digitalWrite(CLK, LOW);
pinMode(CLK, OUTPUT);

ADCSRA = ADCSRA & 0xfd;//Division Factor 128->32

pinMode(BIT_7, OUTPUT);
pinMode(BIT_6, OUTPUT);
pinMode(BIT_5, OUTPUT);
pinMode(BIT_4, OUTPUT);
pinMode(BIT_3, OUTPUT);
pinMode(BIT_2, OUTPUT);
pinMode(BIT_1, OUTPUT);
pinMode(BIT_0, OUTPUT);

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

void loop() {
// put your main code here, to run repeatedly:
signed char min,max,dif;
unsigned char maxad,minad,out;

delay(500);

while(1)
{
digitalWrite(BIT_7, LOW);
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;
 digitalWrite(CLK, HIGH);
 digitalWrite(CLK, LOW);
 digitalWrite(CLK, HIGH);
 digitalWrite(CLK, LOW);
 digitalWrite(CLK, HIGH);
 digitalWrite(CLK, LOW);
 digitalWrite(CLK, HIGH);
 digitalWrite(CLK, LOW);
}

min=-MIN_EDGE;
max= MIN_EDGE;
minad=0;
maxad=0;
for(char j=0;j<31;j++){
 dif=data[j]-data[j+1];
 if(j<30 && dif<min){min=dif;minad=j;} //黒→白エッジ検出
 if(j>1  && dif>max){max=dif;maxad=j;} //白→黒エッジ検出
}
if(min==-MIN_EDGE || max==MIN_EDGE ||(minad>maxad)){
 out=63;
 //63:検出エラー
}else{
 out=(minad+maxad);
 //out=31位が中心に白線がある状態 15~45位の範囲で横ズレ量を示す
}
Serial.println (out);
if(out>=32){digitalWrite(BIT_5, HIGH);out=out-32;}else{digitalWrite(BIT_5, LOW);}
if(out>=16){digitalWrite(BIT_4, HIGH);out=out-16;}else{digitalWrite(BIT_4, LOW);}
if(out>= 8){digitalWrite(BIT_3, HIGH);out=out- 8;}else{digitalWrite(BIT_3, LOW);}
if(out>= 4){digitalWrite(BIT_2, HIGH);out=out- 4;}else{digitalWrite(BIT_2, LOW);}
if(out>= 2){digitalWrite(BIT_1, HIGH);out=out- 2;}else{digitalWrite(BIT_1, LOW);}
if(out>= 1){digitalWrite(BIT_0, HIGH); }else{digitalWrite(BIT_0, LOW);}
digitalWrite(BIT_7, HIGH);

delay(10);//露光時間
}
}
カテゴリー: RMCR 2017 | 続き はコメントを受け付けていません。

ラインカメラをArduino Nanoで動かす


カメラ誘導マシンでよく使われているTSL1401をArduinoで動かしてみる
とりあえず128画素を読んでみると

1フレームの読み込みに15.4ms程度かかっている。遅すぎる。
ので、高速化を検討。
まず、128画素も使わないので4画素に1回のみ取り込むことにしてAD変換の回数を1/4にする。
ライントレースに使うデータとしては、32画素もあれば十分だろう。

4.38ms位になった。これで、露光時間を含めると150fps~160fps位になりそう。
でも、Advanceのセンサ置き換えには、もう少し欲しいところ。

遅い画素の読み取り(AD変換)に手をつける。
analogRead()を早くしたい。
garretlabさんを参照すると
Arduinoの初期化関数init()内でADCの変換時間を決めるADCSRレジスタを設定しているようだ。
早速、hardware/arduino/avr/cores/arduino/wiring.cを覗くと

と書いてある。Arduino Nanoは16MHzなので、ADCSR=0b111(分周比128)になってそうである。
ので、スケッチに戻り、void setup()に下記コードを追記して分周比を32に変更する。
ADCSRA = ADCSRA & 0xfd;//Division Factor 128->32
と、

1.892msとなった。露光時間が2msなら 250fps相当になる。

#define LED 13
#define AO A0
#define SI 11
#define CLK 12

unsigned char data[32];

void setup() {
// put your setup code here, to run once:
pinMode(LED, OUTPUT);

digitalWrite(SI, LOW);
pinMode(SI, OUTPUT);
digitalWrite(CLK, LOW);
pinMode(CLK, OUTPUT);

ADCSRA = ADCSRA & 0xfd;//Division Factor 128->32

Serial.begin(9600);
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(LED, HIGH);
digitalWrite(CLK, LOW);
for (int j = 0; j < 32; j++){
data[j]=analogRead(A0)/4;
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
}
digitalWrite(LED, LOW);
Serial.println (data[15]);
delay(5);
}

}
カテゴリー: RMCR 2017 | ラインカメラをArduino Nanoで動かす はコメントを受け付けていません。

RMCR2017春

逆境からのスタートでしたが、その後は幸運に恵まれ
予選、部門とトーナメント優勝できました。
皆様の助言と、各所で、調整させて頂いたおかげです。
ありがとうございました。

大会を運営してくださったルネサスの皆様や参加者の皆様。
楽しい時間をありがとうございました。

カテゴリー: RMCR 2017 | RMCR2017春 はコメントを受け付けていません。