マイコンカーラリー技交流会


神戸科技高で行われた技術交流会に参加する
関西地区以外にも、広島、福岡、宮崎からの参加者があり30人ほどでの走行会となった。
ちなみにコースレイアウトは先の福岡県技術交流会の長さ違い。

競技は学生A,B,一般A,B,画像処理の5部門で行われ、全国大会でも活躍したロボットの速さを、近くで見ることができた。

イベントを開催してくださった近畿MCR事務局の皆様、ありがうございました

舵角も小さく、滑っていない箇所での速度が上がらない。単純にPWM設定出力が低いいこと原因だが、なぜに、こんなに下げているのか?

JMCR札幌モーターショー2018


札幌ドームで行われたJMCR札幌モーターショー大会2018に参加した
JMCRの名の大会は、何年ぶりだろうか
MCRの聖地の札幌に全国から50台程度が集まった大会となった
大会は一日目に試走、2日目に大会というスケジュールで、
始終モーターショーからの多くの観客の流れがあり賑わっていた。

競技は、室温も高く状態の良いコースなので、全開走行が可能だったが
なーんか加速が鈍く、夏のRMCR大会から使っているモータが傷んでいるかと考えふけていたら、実はバッテリが故障していたり。
予選の終盤にバッテリを交換し満足な記録は出たものの、CMA-さんの異次元の走りには、まったくついていけず。
それでも、運よく準優勝でき、JMCRの賞状を貰うことができた。

素晴らしい大会を運営して下さった、北海道地区の皆様、ありうございました

また、札幌行きたいなー

続きを読む

久々に


科技高で行われた走行会にお邪魔する

なーんかクランクの立ち上がりが遅く感じる。この時期付近から、よく使う3.5m/s以上の加速(と、モータ寿命延長の)ために駆動ギア比を下げたのが影響しいてるのか、エネループプロとかバラストで車重が740gになっているのが影響しているのか?

修理


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

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

続きを読む

ラインカメラを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);//ココで露光時間調整
  }

}

RMCR2017夏


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

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

築地でご飯


三日目


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

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

二日目


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

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

半年振り


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

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

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

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

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;
}