目次
メニュー†コメント†コメントはありません。 Comments/tomise ToDo†
2011年01月21日(金): 実機でのホイール回転確認†直前の一時間で、ホイール以外の割込を全て無効にするとちゃんと検知できるのを確認。 2011年01月20日(木): 電源ラインの修復と電圧の再確認†電源ラインのコネクタを新しくつけ直した所、接触不良は完全に直った。 赤外線LEDの入力が反応しなくなったのをテスタで確認したら、ちゃんと0V <-> 5Vで電圧は変化していた。 フォトカプラはやっぱりうんともすんとも言わない。 2011年01月19日(水): 修正と確認†電源ラインの修復と、赤外線LEDによる回転検出の確認。 3端子レギュレータは生きていたが、どうも端子が駄目になったらしく何度半田付けし直しても接触不良状態。 12Vからのフォトカプラによる入力が相変わらず駄目。 続いて設置前には成功していた赤外線LEDによる回転検出の確認。 ここまできて1つも実機動作確認できないのは悔しいが、時間切れ。 2011年01月14日(金): 実機配線と確認†後付け装備のせいでメータ周りのカウルを外すのが滅茶苦茶面倒な車体なので、とりあえずはバッテリに直接つないで12V周りの確認をした。 次に、と行こうと思ったら一定間隔でリセットとフリーズを繰り返している状態。 次にフォトカプラ経由での点火パルスの入力。 テスタでフォトカプラ周りから電源周りまで順に追っていたら、うっかり12Vをショートさせてしまって煙を上げて焦げた。 気温が低すぎて外での作業が辛いのでとりあえず本日はここまで。 2011年01月12日(水): 回路修正とプログラム†フォトカプラ周りの配線がおかしかったので再修正。 2011年01月07日(金): センサー配線の完成と3端子レギュレータの設置†センサー用の配線を全て完了して、12V -> 5V用の3端子レギュレータを設置。 2011年01月03日(月): 回転数からの計算式†サービスデータより タイヤサイズ†フロントタイヤ 100/80-17 52S 幅100mm 扁平率(タイヤの高さ÷タイヤ幅×100)80% リム径17インチより、 直径 = (17 * 25.4) + (100 * 0.8 * 2) = 591.8mm 外周 = 591.8 * 3.1415 = 1859.2mm 減速比†1速 2.600(39/15) 2速 1.789(34/19) 3速 1.409(31/22) 4速 1.160(29/25) 5速 1.000(27/27) 6速 0.892(25/28) 1次減速比 3.086(71/23) 2次減速比 3.357(47/14) タイヤの回転数 = エンジン回転数 / (1次減速比 * 2次減速比 * n速減速比) 減速比 = エンジン回転数 / (タイヤ回転数 * 1次減速比 * 2次減速比) ホイールは3本スポークなので、立ち上がり、下がりの片方だけの割込なら、1回転で3カウント分。 速度の計算†// これは使わない // 速度(km/h) = (エンジン回転数 / 最終減速比) * タイヤ外周 * 60 / (1000^2) 速度(km/h) = (タイヤ回転数 * タイヤ外周 / 経過時間) * (経過時間から1時間分へ) 2010年12月17日(金): 表示プログラムの作成2とセンサー配線の製作†前回のitos()は0だと表示されないので一行追加。 void itos(char *s, int i, int width) { s[width] = '\0'; s[width - 1] = '0'; for (; i; i /= 10) s[--width] = i % 10 + '0'; while (width) s[--width] = ' '; } 割込ルーチンでどのピンの割込なのかを確かめてからカウント。 #pragma interrupt_handler INT_GPIO void INT_GPIO(void) { if ((PRT0DR & (0x01 << 7)) == 0) ++wheel; } 他も適当に組んで、赤外線LEDを動かすとカウントされるのを確認した。 2010年12月10日(金): 表示プログラムの作成1†起動時の動作チェックアニメーションを何パターンか作成した。 sprintf()の代りにcsprintf()があったが、桁オプションが使えなくて結局使えなかった。 /* * sに整数iをwidth幅で文字列化して格納する * widthが文字列幅以下にならないように注意 * itos(s, 16, 3); // " 16" * itos(s, 8, 5); // " 8" */ void itos(char *s, int i, int width) { s[width] = '\0'; for (; i; i /= 10) s[--width] = i % 10 + '0'; while (width) s[--width] = ' '; } 単位表示で3文字も幅を取るのが勿体ないのでCGRAMに単位文字を定義しようと思ったが、5x7ドットではさすがに難しい。 点火と回転は割込でcountしようと思ったが、割込は同じ関数が呼び出される。 表示更新は割込関数内ではせずにmain()か定期的なタイマー割込でした方が良さそう。 2010年12月03日(金): 赤外線LEDと受光素子†磁気抵抗素子の値の変化が小さすぎてテスタでもわからないので、赤外線LEDと受光素子に方向転換。 2010年11月26日(金): 磁気抵抗素子†磁気抵抗素子DM-106Bの配置と測定。 2010年11月19日(金): スイッチ割込†スイッチ割込でカウント、タイマー割込で定期的に表示更新まで。
PSoCGPIOINT.asmはこんな感じに。 ;@PSoC_UserCode_BODY@ (Do not change this line.) ;--------------------------------------------------- ; Insert your custom code below this banner ;--------------------------------------------------- ljmp _INT_GPIO ;--------------------------------------------------- ; Insert your custom code above this banner ;--------------------------------------------------- ;@PSoC_UserCode_END@ (Do not change this line.) main.cはこんな感じに。先程のPSoCGPIOINT.asmに書いた関数名の先頭から'_'を除いた名前で宣言。 #pragma interrupt_handler INT_GPIO void INT_GPIO(void) { // ... } 調べていて見つけた情報。割込に使ったポートと同じポートに出力するとはまる可能性。 数値 -> 文字列†sprintf()が使えないので、itoa()で。 #include <stdlib.h> char line[17] = {'\0'}; itoa(line, 12345, 10); でもこれだと桁揃えがしにくい。 if (count < 10) ; else if (count < 100) ; else if (count < 1000) ; else if (count < 10000) ; else ; 2010年11月12日(金): 液晶の配線と動作確認†前回の配線図通りに配線。初めにピンを間違えて大幅な時間ロスをした。 文字列の表示はこんな感じ。 LCD_1_Start(); LCD_1_Position(0, 0); // 行, 列 LCD_1_PrCString("LCD Test"); datasheetを見ていると、棒グラフを表示させるなんていう面白いAPIを発見。 使い方はこんな感じ。 LCD_1_InitBG(LCD_1_SOLID_BG); LCD_1_DrawBG(0, 0, 16, 72); // 行, 開始列, 終了行, グラフの長さ DrawBG()の引数がちょっとわかりにくいけど、次のような感じ。 LCD_1_DrawBG(0, 0, 16, 50); // 0行目の0〜16文字を使って50ドットの長さ LCD_1_DrawBG(0, 1, 5, 60); // 0行目の1〜5文字を使って60ドット(5 * 5 = 25を超えるけど超えた分は表示されないから25ドットになる) 良く考えたら16文字だからDrawBG(0, 0, 15, ...)が正しい気がする。 2010年10月31日(日): HD44780の配線図†データシートと睨めっこした結果、こんな感じになった。 2010年10月29日(金): 製作案の発表†何を作りたいかの発表と、その中からどれを実際に作っていくか、大体の方針の決定。 次回までにキャラクタ液晶の配線を考えておく。 2010年10月22日(金): テスト基板の作成†FIRST TOUCHでCapSenseを試した後、ユニバーサル基板にICソケット、LED、抵抗、スイッチを配置して半田付けの作業。 2010年10月15日(金): PSoC FIRST TOUCH†PSoCの開発環境を整え、FIRST TOUCHを使ってLEDを光らせる所まで。 |