Quantcast
Channel: バイクと工作に没頭する日記
Viewing all 227 articles
Browse latest View live

arduinoはじめました。

$
0
0
この間、マルツ電波に行ったら以前より興味があったarduino(アルデュイーノ)の互換ボードのMaruduino(マルデュイーノ)が売っていたので、衝動買いをしました。
arduinoはUSBポートが付いたマイコンですね。
マイコンとは何かと言えば、電気を制御する、ちっちゃなコンピューターですね・・・たぶん・・・・。
プログラムで指示を与えて、LEDをチカチカさせたり、モーターを動かしたり、インジェクターを制御したり、点火タイミングを制御したり・・・・・出来たら良いな。
現物はこんなものです。
イメージ 1

最初からUSBケーブルもついています。
arduinoの良いところは書き込み用のソフトが無料ですし、書き込み用のライターは本体に最初から付いていることですね。
すぐに遊べるのは、うれしいですね。
基盤剥き出しなのは、寒そうなのでタッパーに入れました。
イメージ 2

とりあえず、偉大な先人たちのHpを見ながら、LEDをチカチカさせます。
プログラムはコピペしまくりです。
でも、ただLEDを点滅させるだけでは、マイコンなど必要ないので7セグのLEDを制御します。
7セグのLEDをランダムにチカチカさせたり、数字を順番に表示させたりしています。


次にボタンで目的の数字を表示するようにしてみました。
これでシフトインジケーターも作れます。
イメージ 3
イメージ 4
イメージ 5

どのボタンを押しても目的の表示になります。
ただ、シフトインジケーターのつもりで7個目にニュートラルようにゼロを表示させようとしてもうまくいきません。
まだいろいろ勉強中です。
まったくマイコンの知識がない自分でも、ここまで5時間位でたどり着いたのでかなり扱いやすいマイコンなのではないかと思います。
このおもちゃは、かなり楽しいです!!

最後に今回のシフトインジケータ風の制御のプログラムはこんな感じです。
もっと上手くなれば、綺麗に整理できるのでしょうが、今のところはここが限界です。
いろんな方のHPを参考にさせていただきました。



const int anode_a = 12;  //アノードに接続するArduinoのピン
const int anode_b = 8;
const int anode_c = 5;
const int anode_d = 3;
const int anode_e = 2;
const int anode_f = 11;
const int anode_g = 6;
const int cathode_pin = 13; // カソードに接続するArduinoのピン
 
// 数字と表示させるセグメントの関係
const int digits[] = {
  0b00111111, // 0
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00100111, // 7
  0b01111111, // 8
  0b01101111, // 9
};
 
// 数字を表示する
void display_number (int n) {
  // digits[n]の各ビットを調べて対応するセグメントを点灯・消灯する
  digitalWrite(anode_a, digits[n] & 0b00000001 ? HIGH : LOW);
  digitalWrite(anode_b, digits[n] & 0b00000010 ? HIGH : LOW);
  digitalWrite(anode_c, digits[n] & 0b00000100 ? HIGH : LOW);
  digitalWrite(anode_d, digits[n] & 0b00001000 ? HIGH : LOW);
  digitalWrite(anode_e, digits[n] & 0b00010000 ? HIGH : LOW);
  digitalWrite(anode_f, digits[n] & 0b00100000 ? HIGH : LOW);
  digitalWrite(anode_g, digits[n] & 0b01000000 ? HIGH : LOW);
}
void setup() {
     pinMode(10,INPUT) ;    //スイッチに接続ピンをデジタル入力に設定
    pinMode(anode_a, OUTPUT);
  pinMode(anode_b, OUTPUT);
  pinMode(anode_c, OUTPUT);
  pinMode(anode_d, OUTPUT);
  pinMode(anode_e, OUTPUT);
  pinMode(anode_f, OUTPUT);
  pinMode(anode_g, OUTPUT);
  pinMode(cathode_pin, OUTPUT);
}
void loop() {
     if (digitalRead(10) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(6);
     }     else {
      digitalWrite(12,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(8,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(5,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(3,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(2,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(11,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(6,LOW) ;  //スイッチが押されていないならLEDを消灯  

        if (digitalRead(7) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(5);
     }     else {
      digitalWrite(12,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(8,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(5,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(3,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(2,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(11,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(6,LOW) ;  //スイッチが押されていないならLEDを消灯

      if (digitalRead(9) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(4);
     }     else {
      digitalWrite(12,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(8,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(5,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(3,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(2,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(11,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(6,LOW) ;  //スイッチが押されていないならLEDを消灯

       if (digitalRead(4) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(3);
     }     else {
      digitalWrite(12,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(8,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(5,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(3,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(2,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(11,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(6,LOW) ;  //スイッチが押されていないならLEDを消灯

if (digitalRead(A0) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(2);
     }     else {
      digitalWrite(12,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(8,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(5,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(3,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(2,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(11,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(6,LOW) ;  //スイッチが押されていないならLEDを消灯

if (digitalRead(A1) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(1);
     }     else {
      digitalWrite(12,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(8,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(5,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(3,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(2,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(11,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(6,LOW) ;  //スイッチが押されていないならLEDを消灯

   
 
     }}}}}}}

     




arduinoシフトインジケーター

$
0
0
エンジンをサボってarduinoをやっています。
ただ7セグのledをチカチカさせているだけですが・・・・。
前回は、7個目のボタンを取り付けると、うまく表示が出来ませんでしたが何とかできるようになりました。
でも原因が自分で解らないのですが・・・。
なんか弄って居る内に、できるようになりました。

今度は。スケッチ(arduinoではプログラムをスケッチと呼ぶようです)を色々書き換えてみました。
もっと短くシンプルに!!

動かすとこんな感じです



メモ帳の代わりに無料の回路図を書くソフトで描いた今回の回路図とarduinoのスケッチ
適当に作ったのでピンの並びがかなりゴチャゴチャしてます。
次はもう少し整理しなくては・・・。
ardunoのスケッチも前回よりは少しましになりましたが、まだよくわかっていません。
イメージ 1


const int anode_a = 12;  //アノードに接続するArduinoのピン
const int anode_b = 8;
const int anode_c = 5;
const int anode_d = 3;
const int anode_e = 2;
const int anode_f = 11;
const int anode_g = 6;
const int cathode_pin = 13; // カソードに接続するArduinoのピン
 
// 数字と表示させるセグメントの関係
const int digits[] = {
  0b00111111, // 0
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00100111, // 7
  0b01111111, // 8
  0b01101111, // 9
};
 
// 数字を表示する
void display_number (int n) {
  // digits[n]の各ビットを調べて対応するセグメントを点灯・消灯する
  digitalWrite(anode_a, digits[n] & 0b00000001 ? HIGH : LOW);
  digitalWrite(anode_b, digits[n] & 0b00000010 ? HIGH : LOW);
  digitalWrite(anode_c, digits[n] & 0b00000100 ? HIGH : LOW);
  digitalWrite(anode_d, digits[n] & 0b00001000 ? HIGH : LOW);
  digitalWrite(anode_e, digits[n] & 0b00010000 ? HIGH : LOW);
  digitalWrite(anode_f, digits[n] & 0b00100000 ? HIGH : LOW);
  digitalWrite(anode_g, digits[n] & 0b01000000 ? HIGH : LOW);
}
void setup() {
   
    pinMode(anode_a, OUTPUT);
  pinMode(anode_b, OUTPUT);
  pinMode(anode_c, OUTPUT);
  pinMode(anode_d, OUTPUT);
  pinMode(anode_e, OUTPUT);
  pinMode(anode_f, OUTPUT);
  pinMode(anode_g, OUTPUT);
  pinMode(cathode_pin, OUTPUT);
}
void loop() {
     if (digitalRead(10) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(6);
     }     else {
      digitalWrite(12,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(8,LOW) ;  //スイッチが押されていないならLEDを消灯
     digitalWrite(5,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(3,LOW) ;  //スイッチが押されていないならLEDを消灯
     digitalWrite(2,LOW) ;  //スイッチが押されていないならLEDを消灯
     digitalWrite(11,LOW) ;  //スイッチが押されていないならLEDを消灯
      digitalWrite(6,LOW) ;  //スイッチが押されていないならLEDを消灯
      
        if (digitalRead(7) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(5);
      }     else {

      if (digitalRead(9) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(4);
    
      }     else {

       if (digitalRead(4) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(3);
     
     }     else {

if (digitalRead(A0) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(2);
     
      }     else {

if (digitalRead(A1) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(1);
    }     else { 
    
     
  if (digitalRead(A2) == HIGH) {     //スイッチの状態を調べる
         digitalWrite(cathode_pin, LOW);
         display_number(0);
  
   }     else {

   
 
    }}}}}}}}

     

自作CDI

$
0
0
連日の暑さで、作業場での作業をしたく無いので、秋月電子から部品も来たので、CDIを自作します。
参考にしたのは、HTRocketという名前の自作CDIです。(非常に解りやすいページです。)
回路図などは、上記のページを参考にしてください。

制作にあたっては、廃番の部品があるので若干の変更をしました。
自分が作った時の構成部品はこんな感じでした↓
すべて秋月電子で揃えました、CDI一個分なら1500円以下です。(もし作る場合は、失敗したときのために複数古文用意したほうがいいです。)

通販コード商品名価格数量合計
I-07653サイリスタ 600V8A SMG8C60F サイリスタ 600V8A SMG8C60F1個 ¥50
数量:     個¥50
P-00517片面ガラス・ユニバーサル基板 Cタイプ(72x47.5mm) めっき仕上げ 片面ガラス・ユニバーサル基板 Cタイプ(72x47.5mm) めっき仕上げ1枚 ¥60
数量:     枚¥60
I-04268トランジスター2SC1815Y(60V150mA)(10個入テーピング品) トランジスター2SC1815Y(60V150mA)(10個入テーピング品)1テープ ¥80
数量:     テープ¥80
P-05994メタライズドポリプロピレンフィルムコンデンサ1μF630V 105 メタライズドポリプロピレンフィルムコンデンサ1μF630V 1051個 ¥130
50個 ¥6,000
数量:     個¥260
P-02281絶縁型ラジアルリード型積層セラミックコンデンサー0.01μF50V±10%5mm 10個入 絶縁型ラジアルリード型積層セラミックコンデンサー0.01μF50V±10%5mm 10個入1パック ¥100
100パック ¥3,600
数量:     パック¥100
I-06485フォトカプラ FOD817B フォトカプラ FOD817B1個 ¥30
数量:     個¥30
P-06293ICソケット ( 8P) ICソケット ( 8P)1個 ¥10
数量:     個¥10
I-083625mm黄色LED ESL−R5CHYC020 (50個入) 5mm黄色LED ESL-R5CHYC020 (50個入)1パック ¥340
数量:     パック¥340
I-00124高耐圧整流用ダイオード UF2010 1000V2A 高耐圧整流用ダイオード UF2010 1000V2A1本 ¥20
数量:     本¥20
I-06796ファストリカバリ・ダイオード 200V1A ERA32−02 (20個入) ファストリカバリ・ダイオード 200V1A ERA32-02 (20個入)1パック ¥100
数量:     パック¥100
I-08678三端子レギュレーター 5V1A NJM7805FA 三端子レギュレーター 5V1A NJM7805FA1個 ¥40
5個 ¥190
数量:     個¥40
R-25101カーボン抵抗(炭素皮膜抵抗) 1/4W 100Ω (100本入) カーボン抵抗(炭素皮膜抵抗) 1/4W 100Ω (100本入)1袋 ¥100
2袋 ¥180
数量:     袋¥100
R-25122カーボン抵抗(炭素皮膜抵抗) 1/4W 1.2kΩ (100本入) カーボン抵抗(炭素皮膜抵抗) 1/4W 1.2kΩ (100本入)1袋 ¥100
2袋 ¥180
数量:     袋¥100

サイリスタは東芝の品番が廃番になっているので、別の物にしました、変更に伴って抵抗も3KΩから1.2KΩに変更しています。

次に基盤への配置図です。
まず表(部品を載せる方)
イメージ 1

ピンクの部分が、ジャンパー線の配線です。
緑のEの線は、裏面に配線できなかったアースの線です。
裏から見るとこんな感じです。
イメージ 2

制作手順は↓
イメージ 3
イメージ 4
イメージ 5
イメージ 6
イメージ 7

配置図に載っていない白い部品が付いていますが、これはいずれマイコンによる可変進角に拡張するための準備です。

実際の制作は、これが3個目になります。
最初のは、まったく作動しなくて撃沈!!
2個目は最初LEDがチカチカするものの火花が飛ばなく、サイリスタの変更や回路の見直しをして作動するようになりましたが、裏が何度も修理するうちにゴチャゴチャになったので、3個目できれいに作り直しました。
イメージ 8


エンジンに取り付けて始動してみると、普通に始動します。
ただし!!進角しすぎている!!タイミングライトで確認すると30度以上進角してそうです
試しにPOSHのCDIをタイミングライトで確認すると19~20度くらいの進角でした。(ほぼ正常値)
もう少し調整が必要です。


arduinoでタコメーター1

$
0
0
相変わらずarduinoを進めています。
まだまだ使いこなせていませんが、第一目標としてタコメータを作ってみたいと思います。
とりあえずは、回転数をパソコンに表示できるようにしたいです。
いきなりエンジンで進める訳にはいかないので、以前タコメータの動作試験用に作ったファンクションジェネレーターで信号を出して、それをarduinoで受け取ってパソコンで表示するようにします。

回転数を求めるには、まず最初にarduinoに周波数Hzを検知してもらいたい。
読み取らせるFジェネレーターの信号は短波(方形波)_| ̄|_| ̄|_| ̄|_こんなのです。
この上がって下がっての時間を計れば、周波数がわかるはず。
そのためには、arduinoに上がって下がっての秒数を数えてもらいます。(この数を数えてもらうまでに、2日かかりました。
この時のプログラムは↓

unsigned int hitime = 0;//unsignedは整数のみ intは2バイトの整数 hitimeは代入する名前 =0はhitimeに代入する変数

void setup() {
    pinMode( 3, INPUT );//pinModeはピンの入出力命令(3番ピン、入力)
    Serial.begin( 9600 );//Serial.beginはシリアル通信レート指定( 9600は通信レート他にも有り )
}

void loop() {

     hitime = pulseIn( 3, HIGH );//hitimeは代入する名前  = pulseInは指定ピンがON/OFFになっている時間をhitimeに代入( 3番ピンが, HIGHになっている時間 )
    
        Serial.println( hitime, DEC );//Serial.printlnはデータをシリアルポートに出力します( hitime上で代入された3番ピンがHIGHになっている時間, DECは10進数)
        
       
    }


このプログラムだと電圧が上がった時の時間しか計っていません。
//の後ろの文は自分用の覚書なので、プログラムとは関係がありません。
この時の数字は↓
イメージ 1

大体53470マイクロ秒くらいです。電圧の上げ下げの往復で大体106940μsこの後、実際往復の時間を図るプログラムにして計ると計算道理でした。
周波数の公式F(周波数)=1(1秒)/T(時間)
・・・単位を揃えるとF=1000000μs/106940μs
F=9.351・・・
この時の周波数は実測で9.35Hz位なので、かなり正確な数字が出ました。
この数字には大満足ですarduinoの性能の良さに驚いています。(マイコンをやっている人には当たり前だと思いますが・・。)
この後さらにプログラムを書き足していき最終的には↓

unsigned long hitime = 0;//unsignedは整数のみ intは2バイトの整数 hitimeは代入する名前 =0はintervalに代入する変数
unsigned long lowtime = 0;
unsigned long totaltime = 0;
unsigned long rpm = 0;

void setup() {
    pinMode( 3, INPUT );//pinModeはピンの入出力命令(3番ピン、入力)
    Serial.begin( 9600 );//Serial.beginはシリアル通信レート指定( 9600は通信レート他にも有り )
}

void loop() {

     hitime = pulseIn( 3, HIGH );//hitimeは代入する名前  = pulseInは指定ピンがON/OFFになっている時間をhitimeに代入( 3番ピンが, HIGHになっている時間 )
     lowtime = pulseIn( 3, LOW);

      totaltime= hitime + lowtime ;
      rpm=1000000/totaltime*60;
      
        
        Serial.print( rpm, DEC );//Serial.printlnはデータをシリアルポートに出力します( rpm=1000000/totaltime*60;の計算結果, DECは10進数)
        Serial.println( "RPM");
       
    }

これでFジェネレーターの信号を回転数のRPMにできました。
PCの表示は↓
イメージ 2

現時点ではFジェネレータのきれいな波形だけでの動作なので、バイクで使えるにはまだ課題が多いです。
今後も、色々試して行きますので、のんびりお付き合いください。

arduinoでタコメーター2

$
0
0
相変わらず、arduinoを弄っています。
次の段階は、フォトカプラと言う部品を使って、同じように信号を発信できるかやっていきます。
ちなみにフォトカプラは↓
イメージ 1

この中にはLEDと小人さんがいて、LEDが点くと小人さんがスイッチを押してくれます。
この部品を使うと信号を発信する部分と受信する部分を電気的に分離できます。
電気の波を光信号に変えてくれるので、ノイズの心配が少なくなります。
回路はこんな感じです。↓
イメージ 2

この回路で問題なく信号を受信して回転数を表示できました。
次は、おまけですが、実際のエンジンの回転数を図るときに毎回パソコンを持っていくのは大変なのでarduinoにLCDディスプレイを付けました。
プログラムをLCDディスプレイ用に書き換えて表示させてみます。
イメージ 3

問題なく表示しました。(まだ信号はFジェネレーターで発信しています)
ちなみにLCD用のプログラムは↓

unsigned long hitime = 0;//unsignedは整数のみ intは2バイトの整数 hitimeは代入する名前 =0はintervalに代入する変数
unsigned long lowtime = 0;
unsigned long totaltime = 0;
unsigned long Hz = 0;
#include <LiquidCrystal.h>
 
/* ピンアサインを変更する             */
/* lcd(RS, E, DB4, DB5, DB6, DB7) */
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


void setup() {
    pinMode( 3, INPUT );//pinModeはピンの入出力命令(3番ピン、入力)
    Serial.begin( 9600 );//Serial.beginはシリアル通信レート指定( 9600は通信レート他にも有り )
lcd.begin(16, 2);           /* LCDの設定(16文字2行) */
  lcd.clear();                /* LCDのクリア */
  lcd.setCursor(0, 0);        /* 0列0行から表示する */
  lcd.print("LCD Sample v1.0"); /* 文字列の表示 */
  delay(1000);
  lcd.clear();                /* LCDのクリア */
}

void loop() {

     hitime = pulseIn( 3, HIGH );//hitimeは代入する名前  = pulseInは指定ピンがON/OFFになっている時間をhitimeに代入( 3番ピンが, HIGHになっている時間 )
     lowtime = pulseIn( 3, LOW);

      totaltime= hitime + lowtime ;
      Hz=1000000/totaltime*60;
      
        
        Serial.print( Hz, DEC );//Serial.printlnはデータをシリアルポートに出力します( hitime上で代入された3番ピンがHIGHになっている時間, DECは10進数)
        Serial.println( "RPM");
  lcd.setCursor(0, 0);         /* 0列0行から表示する */
  lcd.print( Hz, DEC);  /* 文字列の表示 */
  lcd.setCursor(7, 0);         /* 0列0行から表示する */
  lcd.print("RPM");
  lcd.setCursor(5, 1);         /* 0列1行から表示する */
  lcd.print("DECORA");  /* 文字列の表示 */     
  delay(1000);
  lcd.clear(); 
    }
    
一応表示できますが、若干の問題アリです。
次回は、いよいよエンジンでテストをしたいです。

arduinoでタコメーター3

$
0
0
まだタコメーターを作っています。
前回の続きでエンジンの点火信号を検出する方法を調べました。
多様な車種で試してみたいので簡単に付け替えられるようにハイテンションコードから信号をとるようにしました。
秋月電子に売っている電流センサーを流用しました。
最初は、このままフォトカプラを駆動させたかったのですが、無理でした。(コイルを巻き直したり色々試しましたがダメでした。)
イメージ 1

オシロスコープで確認すると信号は出ていましたのでトランジスタを利用したスイッチを作って信号を増幅しました。
完成形の回路図↓(一応これで動いたが正しいのだろうか?)
イメージ 2

一応、動画も撮ってみました。
前半はノイズ対策なし、後半はノイズ対策してみたもの、でも次の日テストすると同じ回路なのにノイズが乗りまくり。(↑の回路図はノイズ対策なしの物です。)

音に対して、表示回転数がやけに少ないと思ったので、回転計で測ってみました。
回転計で測った値↓
イメージ 3

自作タコメーターの値↓
イメージ 4

約半分????? もしかして、エイプFIのエンジンは圧縮上死点でしかスパークしない?
調べてみると、圧縮上死点だけの点火の様でした。(合っているか、あまり自信はないですが)

ちなみにマイクロカーのエンジン(NSR50 )の場合は表示が2倍になります。
これはNSR50のエンジンが上死点と下死点の両方で火花を飛ばしているからです。

この表示が半分に成ったり、2倍に成ったりする現象は、プログラムの計算式を変えることによって対応できます。
それよりもノイズを拾って数字が乱れる現象への対応が大変そうです。

プログラムは前回のまま、特に変更していません。

arduinoで点火制御

$
0
0
arduinoでタコメーターは、一定の収穫があり、学習も出来たので次の段階に移ります。
次は、点火制御をして行きたいですが、プログラムについては全く進んでいません。(無い知恵を振り絞って勉強中です。)
プログラムの事を考えすぎて知恵熱が出そうなので、先に点火シュミレーターを作ります。
とはいっても、旋盤にジェネレーターとフライホイールを付けて最小限の点火回路を構成しただけです。

イメージ 1

動かすと、ちゃんと火花が出ます。

綺麗ですね~思わず触りたくなりますが、触るとこうなるので触りません!
この後、自作のCDIで試した所、火花が出ませんでした。
よく調べて見ると充電用の発電用のコイルが死んでいました。(さすが3セット1000円のジャンク品)
自作CDIは一部、充電用の電源を使うので動きませんでしたが、ACアダプターを代用して電源を確保したら、問題なく作動しました。
次回以降、プログラムが進むと良いけど・・・・。

arduinoで進角制御1

$
0
0
前回は、旋盤を利用してシュミレーターにしましたが、このままだと旋盤が使いにくいので、別の方法に変更しました。
使用したのは、コレ↓
イメージ 1

1個500円の遠心分離機、送料が1500円くらい。
コレを利用して点火シュミレーターを作ります。(もう一台は仕事用のバレル研磨機を作ります)

サクッとばらします。
イメージ 2

イメージ 3

あっという間にジェネレーターを取り付けます。(写真撮り忘れました)
イメージ 4

ケースを戻して終了です。
イメージ 5

早速ブレッドボート上に点火回路を組んでarduinoのテストします。
今回からarduino nanoに変更しました。(機能はUNOとほぼ同じです)
イメージ 6

全体図は、こんな感じ。
イメージ 7

動画でテストの様子が見れます。
最初は上手くいかなくて、悩みましたが何とか予定どうりの動きをしてくれました。

可変抵抗を使い点火時期をずらしています。
最終的に回転数ごとの自動進角を目指しますが、可変抵抗を取り付けられるポートが、あと5箇所有るので、まず可変抵抗による進角マップを作れるようにしたいです。
回路図とプログラムは後で資料を、まとめたらアップしたいですが、需要あるのかな?
自分のメモ帳代わりにアップするので、需要無くてもアップします。


arduinoで進角制御2

$
0
0
アップするほどの内容が無く、更新をサボりまくっていました。
前回のアップから実験用の回路も変更を加えて可変抵抗も増やして、可変可能な回転数も6箇所に増加しました。
実験回路は、現在こんな感じです。
イメージ 1

もうごちゃごちゃで、作った本人も、よく判っていませんが各回転域ごとの可変は上手くいっています。
シュミレーション上だけですが・・・。
ここまで来るのにプログラムの変更を何度もしています。
この回路を清書して本番用の基板を作ります。
プリント基板の制作はやったことがないのですが、試してみます。
方法はレーザープリンタを利用する方法でやって見ます。(細かい方法は、プリント基板・レーザープリンタなどで検索してください。)
まずCADで清書した基板パターンをレーザープリンタで出力します。
イメージ 2

基板に乗せてアイロンで貼り付け・・・。
イメージ 3

何度やっても上手く行きません・・・・。
基板への定着率が低いです。
上手く行けば金属へのエッチングは応用範囲が広く楽しそうだったので残念です。
今回はこの方法は諦めて、CNCマシンで切削して基板を作りました。
完成基板はコレ↓
イメージ 4

完成した基板にパーツを付けるとこんな感じになります。
イメージ 5

早速、シュミレーターに接続して確認しますが、全く点火しません・・・。
回路を確認すると、数箇所間違いが・・・。
間違いを修正していると致命的な問題が出たので、この回路はやり直しです。

最近はこんな感じで、3歩進んで2歩さがる状態です。(時には5・6歩下がっていますが。)
早く完成させてマイクロカーで試してみたいです。

arduinoで進角制御3

$
0
0
本日、始めて自作CDIのテスト走行をしました。
最初は、カブ系のエンジンの点火プログラムをNSR50系のエンジンのプログラムに修正するのが、上手く行かなくて苦労しました。
プログラムの補正が出来ると、あっけないほど普通に始動できました。
プログラムの修正や取り付けに時間が掛かってあまりテスト走行は出来ませんでしたが、少し走った感じだとトルク特性が少しフラットに成ったかな・・・?
あと、高回転も少し良さそう。(レブリミッターを設定してないから?)
まだ、本格的に調整できてないので何ともいえませんが、全体としては悪くないです。
これで耐久性が有れば完璧だと思います。

今回は、CDIから自作していますが、制御するなら車用のダイレクトイグニッションを利用したほうが、楽かも?(バッテリー点火には成ってしまいますが・・・。)

需要が有るとは思えませんが、自分用に回路図をアップしておきます。
過去にハードディスククラッシュで、ひどい目に合いました。(新エンジン計画で作ったエンジンの設計図の90%以上を消失しました)
イメージ 1

回路図は多分あっていると思いますが、制作の際は自己責任で。
すばらしいCDIを考案されたHTRocketさんに改めて感謝です。
マイクロカーに搭載する時に整備しやすいように、シートを跳ね上げ式にしました。
イメージ 2

一応、完成したCDIの写真も載せておきます。(作業に熱中してたら写真を撮り忘れた。)
ケースを開けた状態です、車体に搭載した時には閉じてあります。
コントローラーは、まだ固定する場所を決めてないので、とりあえず、ひざの上に置いておきました。
イメージ 3

ちなみに、このCDIでは進角を進めることは出来ません。
自作CDIをNSR50系のエンジンで使うと、以上に点火時期が進んでしまうので、それを少し遅らせて適正なタイミングにしています。

今の所ダイヤルの左から
~4000
4000~5000
5000~6000
6000~7000
7000~8000
8000~
の6分割しています。

今回のテスト走行で気が付いたことは、タコメーターを見ながらの調整は困難なので、今後調整可能なダイヤルにLEDを付けて光らせようかと思います。

以下はarduino のスケッチです。
プログラム初心者が無理やり作ったプログラムなので公開するのは恥ずかしいですが、これもデータバックアップだと思う事にします。
もっとスマートなプログラムが書けるように成りたい・・・。(arduinoの講習会ってやってないのかな?)



const int enPin1 = 7;
int inpin =12;

unsigned long us;
unsigned long ptime;

void setup() {
 
  pinMode(enPin1, INPUT);
  pinMode(inpin,OUTPUT);
 }

void loop() {
  int val0;
  int val1;
  int val2;
  int val3;
  int val4;
  int val5; 
  val0=analogRead(0);
  val1=analogRead(1);
  val2=analogRead(2);
  val3=analogRead(3);
  val4=analogRead(4);
  val5=analogRead(5);
 
   us=pulseIn(enPin1,LOW);

    if(us>3750){
  ptime=((us/45)*(val0/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(30);
digitalWrite(inpin, LOW);
    }
else if(us<=3750&&us>3000){
 ptime=((us/45)*(val1/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(30);
digitalWrite(inpin, LOW);
}
else if(us<=3000&&us>2500){
 ptime=((us/45)*(val2/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(30);
digitalWrite(inpin, LOW);
}
else if(us<=2500&&us>2144){
 ptime=((us/45)*(val3/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(30);
digitalWrite(inpin, LOW);
}
else if(us<=2144&&us>1875){
 ptime=((us/45)*(val4/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(30);
digitalWrite(inpin, LOW);
}
else if(us<=1875){
 ptime=((us/45)*(val5/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(30);
digitalWrite(inpin, LOW);
}
}



arduinoで進角制御4

$
0
0
自作可変CDIのバージョンアップとテストをして来ました。(名付けてDECORA可変CDI ver1.5)
前回の少しのテスト走行で、走行時調整できるダイヤルがわかり難かったので、現在調整可能なダイヤルをLEDで光らせて判る様にしました。
イメージ 1

少し見難いですが、シュミレーションの動画も撮ったのでアップします。

進角(遅角)をしているところ。


車体に取り付けるとこんな感じ。
イメージ 2

早速テスト走行に行きます。
とりあえず、まともに走るまでが結構メンドクサイ。
点火タイミングが合わないと、すぐモソモソ言ってストールします。
でも、タイミングが合うと元気よく走り出します。
火花が強くなったせいなのか、点火タイミングが良いのか全体のトルクは上がっています。
最高速も、数Km/h増加しました。
今後の課題としては、5000RPM以下はほとんど固定で問題なさそうなので、調整回転数を高回転を細分化するほうが効果的です。
あと回りすぎるので、レブリミットはだと感じました。

新しい回路図と、プログラムは、まだ清書が出来てないので、出来たらアップします。(基本的には前回のものとあまり変わっていません。)

arduinoで進角制御5

$
0
0
本日のアップは自分用のアップです。
まず、現時点でのNSR50系エンジン用の遅角CDI用の回路図。
イメージ 1

回路図の疑問点。
・arduinoからの出力用のフォトカプラは必要ないかも・・・。考えた時には回路を分離できノイズの問題を軽減できると期待したけど、GNDを共有しているので、あまり意味がないように感じる。
・遅角制御用のボリュームは、セッティングの時には役立つが、実用運転が始まると故障の原因になりそう。
対策は、セッティングが出たらアナログ値を調べてプログラムで固定する。


//以下は今回のプログラム、このプログラムはNSR用のため他の車種では合わないと思います。
const int enPin1 = 7;
int inpin =12;

unsigned long us;
unsigned long ptime;

void setup() {
  DDRD = DDRD | B01111110 ;//ポートを直接制御する文
  pinMode(enPin1, INPUT);
  pinMode(inpin,OUTPUT);
 }

void loop() {
  int val0;
  int val1;
  int val2;
  int val3;
  int val4;
  int val5; 
  val0=analogRead(0);
  val1=analogRead(1);
  val2=analogRead(2);
  val3=analogRead(3);
  val4=analogRead(4);
  val5=analogRead(5);
 
   us=pulseIn(enPin1,LOW);//NSR50ではLOWにする。

    if(us>3750){ //
  ptime=((us/45)*(val0/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(5);
digitalWrite(inpin, LOW);
PORTD = B00000100;
    }
else if(us<=3750&&us>3000){
 ptime=((us/45)*(val1/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(5);
digitalWrite(inpin, LOW);
PORTD = B00001000;
}
else if(us<=3000&&us>2500){
 ptime=((us/45)*(val2/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(5);
digitalWrite(inpin, LOW);
PORTD = B00010000;
}
else if(us<=2500&&us>2144){
 ptime=((us/45)*(val3/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(5);
digitalWrite(inpin, LOW);
PORTD = B00100000;
}
else if(us<=2144&&us>1875){
 ptime=((us/45)*(val4/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(5);
digitalWrite(inpin, LOW);
PORTD = B00000010;
}
else if(us<=1875){
 ptime=((us/45)*(val5/22));
  delayMicroseconds(ptime);
  digitalWrite(inpin, HIGH);
   delayMicroseconds(5);
digitalWrite(inpin, LOW);
PORTD = B01000000;
}
}

//今回のプログラムで大きな変更は、調整可能ボリュームのLEDを点灯するプログラムをdigitalWriteを使用せず、PORTD = B00000100;で直接ピンを制御したこと。
これにより、高回転時のプログラム遅延を減らすことが出来た。

次回以降、改善したい部分は、今回は自作CDIの特徴のおかげで、遅角する必要があったので、比較的簡単に制御できたが、できれば一周前の信号から最適な点火タイミングを出せるようにしたい。
プログラム中delayMicrosecondsを多用しているがもっと減らしてプログラムのスリム化をしたい。

今回は、ほぼ独り言なので、公開しなくてもと思いましたが、一応アップしておきます。

arduinoで進角制御 (番外編)

$
0
0
進角制御3の記事で自分で書いたことが気になって、車用のダイレクトイグニッションコイルを入手しました。
イメージ 1

軽自動車用の3本セットでした。
一本は回路を組んでarduinoに接続。
イメージ 2

とりあえず点火テストをするだけなので、10行にも満たないプログラムをサクッと書きます。
ブレットボードについているボリュームで仮の回転数とします。
放電時間は2msにしましたが、正しいのか謎です。
最大放電回数は15000回転を想定して1秒間250回とします。

実験結果としては、CDIを作るより簡単に制御できそう。
何といってもarduinoで直接制御できるのが嬉しい。
デメリットは、
・バッテリー点火に成る。
メリットは、
・回路の簡略化。
・強い火花。(実験では安定して出るのは27000V位でしたが、放電時間を増やせば30000V以上も可能だと思う。)

上手く使えば、旧式のポイント点火のエンジンにもデジタル進角を搭載できるかも?
なかなか興味深い実験でした。
とりあえずarduinoで進角制御は、自分のマイクロカーで動作するのが確認できたので、いったん終了です。
今後は、必要に応じて修正していきます。

一応、コンプレッサー決定

$
0
0
寄り道をして、止まっていた過給機の続きですが、一応コンプレッサーを決めました。
軽のルーツ式コンプレッサーを、分解した結果追い加工で50ccへのダウンサイジングは無理だと判断しました。
結果、軽のターボを利用した、遠心式にしました。(他にもプランが有るので、もしかしたら変更するかもですが)
まずサクッとターボをばらします。
イメージ 1

開けてみて、少し驚きましたターボの中の羽が小さい・・・。
とりあえずこれをCAD化して、設計図を引いていきます。
使うCADは、onshape条件はありますが無料で使えるのでとても助かります。(趣味で使うには、十分だと思います。)
イメージ 2

イメージ 3

タービンとタービンハウジングは、採寸して描きました。
残りの部品は、今後新規に用意していく予定の部品です。
既製品なども使いますが、一部は制作予定です。
3Dモデルは、onshape上で公開していますので、アカウントを作ってコンプレッサーで検索すると見れるはずです。
まだ、初心者なので3Dモデルの描き方に、問題が多いですが3D CADは使い始めると手放せなくなりますね。

ちまちま設計・・・。

$
0
0
相変わらずCADで設計をしています。(だんだん飽きて来ました。)
何とか設計の終わりが見えてきましたが、この後CNCの準備などまだPCの作業が続きます。
今の状態は↓
イメージ 1

イメージ 2

イメージ 3

ピンクの部分は、仮のエンジンをモデリングした物でジェネレーターカバーのネジ位置以外は定規で適当に採寸したものなので、あくまでイメージです。

この設計で予想されるタービン回転数は43000RPM位・・・少し少ない。
過給できるか、ただの吸気抵抗になるか不明です。

駄目なら50cc用に、小さくしたコンプレッサーを作る予定です。


天気が良いので、チョコっとツーリング。

$
0
0
天気が良かったので、ちょっと林道に行ってきました。
林道自体は、たまに行く諸小沢線でした、ダートは暫く続いた雨のため大分荒れてきていました。
林道に行くと野生動物に時々あいます。
今回は、イノッシー!!林道では初めて見ました。
イメージ 1

なにか一心不乱に掘って食べてます。

イメージ 2

うわ!!こっち見た!!
突進されても困るので、退散します。
初めて野生の、いのししを見たけど結構大きかったです。

制作開始。

$
0
0
いよいよ製作開始しましたが、ツーリングの後、風邪で寝込んでいました。
とりあえず、少し制作が進みました。
まず最初にタービンのインペラを保持するベアリングホルダなどを制作していきます。
最初に個々のパーツの図面を制作します。
イメージ 1

実際には製作中に問題があったので図面を変更しています。
制作の作業風景
イメージ 2

旋盤にセットして寸法に注意しながら削っていきます。
寸法を0.1mm間違えたので反対に付け替えてやり直しました。
イメージ 3

イメージ 4

今度は慎重に問題なく進んでいます。
写真を撮り忘れたので少し飛ばして。
出来上がった部品を仮組みして見ます。
イメージ 5

タービンの羽と制作したベアリングホルダが干渉するのでシムを入れて高さを調整してタービンハウジングに組みつけて見ます。
イメージ 6

息を吹きかければ、羽がすこし回ります。
このくらい動作が軽ければ問題無しです。
試しに本来の吹き出し口に掃除機を当てて空気を吸い込んで見ると結構な勢いで羽根が回ります。
次は、エンジンとの接続用のベースプレートの制作ですが、購入するアルミ板のサイズを間違えてしまったので、買い直しです。
暫くは材料待ちです。

ジェネレーターカバー追い加工

$
0
0
今回はジェネレーターカバーの追い加工をします。
正直ちゃんと精度を出すなら、カバーを新造したほうが良いのですが、予算が無いので純正を追い加工していきます。
フライスにセットして加工します。
フライホイールのセンターにあわせて加工したいのですが、基準点が無いので仕方無くカバーの外周を基準にします。(多分ずれていますが、ズレが少ない事を祈ります。
自分のフライスではセットできなかったので、チェーンカバーの所を少しカットしてあります。
イメージ 1

ガリガリ削ってとりあえず、いらないフタを切り取ります。
イメージ 2

この後、旋盤で図面どうりの寸法に仕上げていきます。
イメージ 3

次回は、材料も届いたので、タービンとエンジンを繋げるプレートを作っていきます。

タービン固定プレート

$
0
0
タービンとエンジンを固定するプレートを作っていきます。
CNCマシンで切削しますが、今回は穴のみの切削です。(サイズが大きくてアウトラインは切削できないので。)
イメージ 1

アウトラインの制作風景は撮り忘れましたのでいきなり完成です。
イメージ 2

とりあえず先に作ってある、ジェネレーターカバーにセットして見ます。
予想どうりセンターが出ていません・・・。
仕方が無いので干渉する部分をグラインダーで削ってあわせます。
イメージ 3

上側に少し隙間がありますが溶接で埋めます。
次回は、いよいよ溶接。

いよいよ溶接!新兵器導入!!

$
0
0
やっと溶接まで進みました、今回から新兵器導入します。
今回の加工の目玉は、アルミの部品が多い!今までは鉄の部品がほとんどでした。
今までの溶接機でも一応アルミの溶接は出来ますが、半自動でのアルミの場合は溶接ビートが山盛りに成ってしまいます。
そこで、交流TIGを導入しました。
イメージ 1

予算の都合で中華製です。
色々不安は有りますが鉄工所のように使用頻度が、あまり多くないので沢山の予算は掛けられません。(他にも欲しい物は沢山有りますので。)
購入元はWELD TOOLさんです。
早速試しに端材を溶接して見ました。
TIGは高校以来でしたが、母材の条件が良ければ上手行きます。
母材の条件が悪ければ、すぐに上手く行かなくなりますが・・・。
端材の練習をブログに載せても仕方が無いのでいきなり本番です。
イメージ 2

上の写真は、今回一番上手く行った場所です。
下の写真は、今回一番汚くなった場所です。
イメージ 3

上手く溶棒が入らなくて汚く、モリモリに成って行きました。
全体ではとりあえず、付いているので良しとします。
モリモリになった所を綺麗に削ります。
イメージ 4

アルミの溶接で感じたのは、思ったより歪みますね。
同じ穴の板を2枚作って有るのに穴の位置が、それぞれずれてしまいました。
仕方が無いので一部設計変更して対処します。
せっかくなので、仮組みします。
イメージ 5

イメージ 6

イメージ 7

イメージ 8

次はプーリーの加工です。

Viewing all 227 articles
Browse latest View live