понедельник, 13 июля 2015 г.

USB-to-TTL Serial из USB-to-RS-232 (переходник Defender) для прошивки ARDUINO

Итак, есть RS-232 последовательный порт. Он подразумевает уровни +13В 0 и -13В 1, управляющие сигналы -13В 0 и +13В 1. Это классический последовательный
порт, старые принтеры, мыши работают вот так. И переходники USB-to-RS232 работают также. Нельзя их использовать на прямую без переделки для программирования Arduino PRO MINI.

Даже спалить можно. Для ардуино нужен TTL последовательный порт (переходничок USB-to-TTL Serial называется). Это 0В 0 и 5В - 1. Используется в преходниках чип Prolific PL2303. Он реализует TTL последовательный порт. У него 1,5 нога - это TXD, RXD и 2 - DTR. Подпаяться нужно умудриться - микросхема очень маленькая (между ножками 0,6 мм). Землю беру с желтого провода DB9 (выходные провода переходника), а +5В беру прямо из USB (входной красный провод).
Вообще ардуину можно прошить и 3мя проводами умудриться - земля, TXD, RXD, только кнопку RESET вовремя тыкать. И питание если внешнее. Но можно и с DTR (4 провода) - чтобы RESET не тыкать, а лучше и с +5В (5 проводов), чтобы запитать микрочип сразу. Делаем конечно 5 проводов на выходе.

Проверил - все работает!!!

Схема здесь.

Это когда компаунд сковыривал, порезался до крови. Много крови...

Драйвер здесь, скачал с какого-то сайта. Для моего переходника Defender работает отлично!
https://drive.google.com/file/d/0B1AR0G3hSwPZeTAxeGFjVm1ObTQ/view?usp=sharing

Очень трудно было добраться до чипа. Он был залит компаундом. Потихоньку паяльником расплавил. Компаунд суперский! Им как раз тонкие провода заливать и микрочипы.

Фото:









воскресенье, 7 июня 2015 г.

Часы роеального времени для АРДУИНО

Зарядка аккумуляторов мобильных

Напряжение 3,7В, зарядка дает 4,2В, при подключении разряженного аккумулятора 4,02В. Некоторые мобильники не заряжаются - при сильном разряде аккума. Тогда подключаешь специальную зарядку и заряжаешь чисто аккумулятор. Очень полезная вещь.

Сигнализация в контору Юриста

Пока стоят гудок волговский: 72 ватта, выдают 110 децибел (звук вертолета на расстоянии 1 м), это звуковое давление, обычная автомобильная релюха на 12 вольт и гелевый аккумулятор на постоянном подзаряде умной подзарядкой, компенсирующей токи утечки. Орет очень хорошо, но ток потребляемый высок 6А, блок питания компьютерный не выдерживает. Пришлось аккум поставить. Он кратковременно хорошо выдает.

С аккумом проблема - он вечно испаряется. Подливаю воду постоянно.

Есть идея поставить такую сирену:

http://www.lightinthebox.com/ru/wired-high-decibel-alarm-siren_p238055.html

она 109 дб,  т.е. по звуку тоже самое, можно обычный блок питания поставить - потребляет всего 15 ват, это 1,5А будет где-то.


03.10.16
Идеи идеями, купил в магазине очень звонкий звонок на 220В и решил попробывать с датчиком движения.
Датчик движения за 390 рублей ДД-009, красивый круглой формы.
Звонок СП1221 ЧАША (240 рублей).
Схема вот:





















Итог: поставил время на минимум. Составило где-то 30 секунд.Схема зазвонила один раз и заткнулась. Долго искал причину - оказывается сгорел звонок, точнее отпаялся диод. Запаял прочно - сгорел звонок понастоящему, расплавилась обмотка... Звонок некачественный, даже 30 с звона не выдержал - сломался, задымился.


13.10.16
Решил сделать, посоветовавшись с специалистами гудок от Волги, спаяв простейший однополупериодный выпрямитель.
Транс от УПСа, первичка - черный и желтый провод, сопротивление около 30 Ом, вторичку мультиметром определил, выдавала 18,2В (толстые красные провода). Как спаял схему, замерил под нагрузкой и ХХ. ХХ - 24,6В, нагрузка - 16,6В. Гудит сильно - что надо! Жена даже матом заругалась.

Детали:
Транс EI96X35 UPS/T-500220-KB326
Диод Д231
Радиатор диода - алюминевая пластина 90*70*10
Конденсатор 10000мкФ 50В
Гудок ГОСТ Р52230-200 Тон низкий.
Датчик движения старый - ДД-009 круглый.

Провода токовые от вторички толстые 4 мм2, остальные 1,5 мм2.
Схема:



Коробку вырезал из ДСП.

Остальные фотки:












24.10.16
Недавно установил сигнализацию. Освещенность ДД на минимум - срабатывает даже на свету. Задержка на минимум - где-то орет 10 секунд. Пробывал поболе, но через минуту работы запахло горелым - транс начал плавиться!!! Поэтому 10 секунд хватит. Орет что надо!!!

пятница, 12 декабря 2014 г.

переделка звонка на свет на лестнице.

Звонок сделал обычный от кнопки. Тоже кнопка с бай электрика!!! Даже у нас в Ахтубинске. А сенсор на лампочку на лестнице. Подпаял резисторы 910+240 кБ. Чтобы загоралсь. А то видит свет ниже на 2м этаже и не загорается)))

Сгорел 21го.

воскресенье, 9 ноября 2014 г.

Карманная БИНС

На базе Ардуино Arduino pro mini 5 v 16 mhz, сделал БИНС.

24-25.10.14
Собал первую рабочую схему.
GY-52 - акселерометр + гироскоп,  YL-30 - регистратор на SD-карту.
Подключение GY-52: протокол I2C, INT - 2, VCC - 5 v, SCL - A6,SDA - A5,GND - GND.
Общение: подключаю файл I2Cdev.cpp .h или просто Wire.h. Идет работа с регистрами по id.

Подключение YL-30 - GND-GND,MISO-12,SCK-13,MOSI-11,CS-4,3.3v,GND,5v.
Подключаются три библиотеки SD.h и еще несколько. Протокол SPI

27.10
На днях проверил алгоритм дмп6. Уплыла далеко-далеко траектория... Разбираюсь с квартернионом.


09.11
Заработал алгоритм счисления пространственного положения: курс, тангаж, крен. Оказывается нужно использовать показания акселерометров для коррекции. Алгоритм называется MadgwickAHRS. Хороший - устойчивые показания



Питание - 3,6 в на адаптер - и запитываю АГ и регистратор. Регистратор требует питание 3,3 в и 5 в. Но похоже нормально работает и от 5 в только. АГ работает только от 5 в.

Регистрация 100 Гц. При 1000 Гц захлебывается - не успевает писать.


Итак, прога, которая пишет сырец на SD-карту:


#include "MPU6050.h"
#include "Wire.h"
#include "SD.h"
#include <math.h>

#define LED_PIN 13


MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
float time,ax1, ay1, az1, gx1, gy1, gz1;
int16_t tmp;
File dataFile;
long t = 0;


bool blinkState = false;

void setup() {
        Wire.begin();
        Serial.begin(115200);
        accelgyro.initialize();
accelgyro.setRate(0);//1000 пїЅпїЅ
accelgyro.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);//+-2g
accelgyro.setFullScaleGyroRange(MPU6050_GYRO_FS_250);//250 gr/s
accelgyro.setXAccelOffset(265);
accelgyro.setYAccelOffset(-1835);
accelgyro.setZAccelOffset(976);
accelgyro.setXGyroOffset(132);
accelgyro.setYGyroOffset(241);
accelgyro.setZGyroOffset(1669);
pinMode(LED_PIN, OUTPUT);
if (!SD.begin(4)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
}

void loop() {
    // read raw accel/gyro measurements from device
       t=millis();
       time=t/1000.0;
       accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
       tmp=accelgyro.getTemperature();
       ax1=ax/32768.0*2.0;
       ay1=ay/32768.0*2.0;
       az1=az/32768.0*2.0;
       gx1=(gx-48)/32768.0*250;//-9
       gy1=(gy+86)/32768.0*250;//+6
       gz1=(gz-21)/32768.0*250;//-2
        // display tab-separated accel/gyro x/y/z values
        Serial.print(time,3); Serial.print("\t");
        Serial.print(ax1,6); Serial.print("\t");
        Serial.print(ay1,6); Serial.print("\t");
        Serial.print(az1,6); Serial.print("\t");
        Serial.print(gx1,6); Serial.print("\t");
        Serial.print(gy1,6); Serial.print("\t");
        Serial.print(gz1,6);Serial.print("\t");
        Serial.println(((tmp+ 12412.0) / 340.0),6);
dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
        dataFile.print(time,3); dataFile.print("\t");
        dataFile.print(ax1,6); dataFile.print("\t");
        dataFile.print(ay1,6); dataFile.print("\t");
        dataFile.print(az1,6); dataFile.print("\t");
        dataFile.print(gx1,6); dataFile.print("\t");
        dataFile.print(gy1,6); dataFile.print("\t");
        dataFile.print(gz1,6);dataFile.print("\t");
        dataFile.println(((tmp+ 12412.0) / 340.0),6);
dataFile.close();
    // blink LED to indicate activity
    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
} else {digitalWrite(LED_PIN, LOW);}
}


Подключаются еще 3 библиотеки: SD, MPU6050, I2Cdev. Архив с кодом: https://drive.google.com/file/d/0B1AR0G3hSwPZUlN4RXRibnN4SXc/view?usp=sharing

вторник, 28 октября 2014 г.

Система зажигания Оки на ардуино




РАБОЧАЯ СХЕМА

ПРОШИВКА (№ 18, 15.03.15)
   
int dh = 2;   //вход - датчик холла. спаду импульса (с 1 на 0) должен происходить момент зажигания
int dh2 = 5;   //вход - другой датчик холла.
int sz1 =  3;  //выходы на полевики свечей зажигания
int sz2 =  4;
int ind =  13;

bool dh_old =LOW;//старое и текущее состояние сигнала от ДХ
bool dh_new = LOW;
bool dh_front=LOW; 
bool dh_spad=LOW;//по спаду импульса с дх срабатывает
bool dh2_old =LOW;
bool dh2_new = LOW;
bool dh2_spad=LOW;
bool dh2_front=LOW;

bool first;//чередовать искры
unsigned long t0;//фиксированный момент времени. Использую для засекания промежутков времени
unsigned long t1;//время первого  фронта ДХ2
unsigned long dt;//временной интервал между текущим сигналом с ДХ и предыдущим.
unsigned long oborot;//количество оборотов в минуту
unsigned long oborot_old;
unsigned int i=8;//для завода
unsigned int j=1;//для завода

bool flag;//фронт ДХ2 был
bool flag2;//спад от ДХ2 был и между фронтом и спадом не больше 2 секунд, причем этот спад и фронт ПЕРВОГО ИМПУЛЬСА после включения зажигания
bool flag_front;//флаг фронта импульса
bool flag_nak;//идет накопление
unsigned long t_nak;//время с момента накопления
unsigned long t_front;//время c фронта импульса с ДХ

void setup() {
  Serial.begin(115200);
  pinMode(dh, INPUT);      //инициализация входов и выходов
  pinMode(dh2, INPUT);    
  pinMode(sz1, OUTPUT);   
  pinMode(sz2, OUTPUT);   
  pinMode(ind, OUTPUT);
  dh_old=digitalRead(dh);
  digitalWrite(sz1, LOW); //берегу полевики
  digitalWrite(sz2, LOW);
  digitalWrite(ind, LOW);
  first=HIGH;
  flag=LOW;
  flag2=LOW;
  t0=0;
  t1=0;
  flag_front=LOW;
  flag_nak=LOW;
  }

void loop(){
dh_new=digitalRead(dh);  
dh2_new=digitalRead(dh2);
dh_front=LOW;
dh_spad=LOW;
dh2_front=LOW;
dh2_spad=LOW;
//ДХ спад
if((dh_new==LOW)&&(dh_old==HIGH)) {
if (digitalRead(ind)) {digitalWrite(ind, LOW);} else {digitalWrite(ind, HIGH);}
dh_spad=HIGH;
dt=millis()-t0;
oborot=60000.0/dt;
if (oborot<150||oborot>6000) {dh_spad=LOW;}//некондиция по оборотам, пропускаю сигнал
if (oborot>3*oborot_old) {dh_spad=LOW;}
t0=millis();
oborot_old=oborot;
}

//ДХ фронт
if((dh_new==HIGH)&&(dh_old==LOW)) {
dh_front=HIGH;
if (oborot<150||oborot>6000) {dh_front=LOW;}//некондиция по оборотам, пропускаю сигнал
if (oborot>3*oborot_old) {dh_front=LOW;}
}

//ДХ2 спад
if((dh2_new==LOW)&&(dh2_old==HIGH)) {
dh2_spad=HIGH;
}

//ДХ2 фронт
if((dh2_new==HIGH)&&(dh2_old==LOW)) {
dh2_front=HIGH;
if (!flag) {t1=millis();}
flag=HIGH;
Serial.println("");
Serial.print("dh2 front");Serial.print("\t");Serial.print(flag);
}


dh_old=dh_new;
dh2_old=dh2_new;
////////////////////////////////////////////////////




if (dh2_spad) {//формирования flag2 - спад 1-го импульса, общая длительность импульса не более 2 с.
flag2=LOW;
if((millis()-t1<=1000)&&(t1>0)) {flag2=HIGH;}
Serial.println("");
Serial.print("dh2 spad");Serial.print("\t");Serial.print(flag2);
}


if (!flag){
//завод машины
//4 мс = 8 градусов. т.е. сдвишка УОЗ первых искр 32 градуса. Затем убывает до 4 градусов.
// схема завода: 8 8 7 7 6 6 5 5...2 2 2 2...

if(dh_front){//обработка фронта от ДХ
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print("front, ojidanie");
}


if(dh_spad){//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print(oborot);Serial.print("\t");Serial.print(dt);
digitalWrite(sz1, HIGH); //формирую импульсы на катушку зажигания
digitalWrite(sz2, HIGH);
if ((i>2)&&(j==3)) {i-=1;j=1;}
delay(i);
if (i>2) {j+=1;}
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
Serial.print("\t");Serial.print("ot spada zaderjka i iskra");Serial.print("\t");Serial.print(i);
}//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
} else {///если железо попало в щель и первый фронт дх2 сформировался.
///////////////////////////////////////////////////////////////////////////////////
if(dh_front){//обработка фронта от ДХ
Serial.println("");Serial.print(millis());Serial.print("\t");Serial.print("front");
flag_front=HIGH;//флаг фронта, сохраняется до спада
t_front=millis();
}


//поочередное накопление энергии на катушках
if(!flag_nak&&flag_front){//формируется флаг на накопление//1
if (dt/3<12) {//2
flag_nak=HIGH;//пора накоплять
t_nak=millis();
Serial.println("");Serial.print(millis());Serial.print("\t");Serial.print("nakopl, dt/3 menshe 12");
if(first) {digitalWrite(sz1, HIGH);Serial.print("\t");Serial.print("1 svecha nakoplenie");} else {digitalWrite(sz2, HIGH);Serial.print("\t");Serial.print("2 svecha nakoplenie");}
} else {      //накопление с задержкой  //2
if (millis()-t_front>dt/3-10) {//3
flag_nak=HIGH;t_nak=millis();Serial.println("");Serial.print(millis());Serial.print("\t");Serial.print("hakopl s zaderjkoi");Serial.print("\t");Serial.print(dt/3-10);
if(first) {digitalWrite(sz1, HIGH);Serial.print("\t");Serial.print("1 svecha nakoplenie");} else {digitalWrite(sz2, HIGH);Serial.print("\t");Serial.print("2 svecha nakoplenie");}
}//3
}//2
}//1

if (flag_nak&&(millis()-t_nak>50)) {//защита ключей (если заглохла как-то неудачно)
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print("ZACHITA KLUCHEI!!!");
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
flag_nak=LOW;
Serial.print("\t");Serial.print("spad, iskra!!!");
}

if(dh_spad){//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print(oborot);Serial.print("\t");Serial.print(dt);
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
flag_nak=LOW;
flag_front=LOW;
Serial.print("\t");Serial.print("spad, iskra!!!");
if (!flag2) {first=!first;} else {flag2=LOW;}//реализация чередования искр, если flag2=HIGH, то пропустить ОДИН раз чередование искр
}//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
}///


}//loop

 
КОМПЛЕКТУЮЩИЕ

НАИМЕНОВАНИЕ
ГДЕ ДОСТАТЬ
СТОИМОСТЬ (ПО СОСТОЯНИЮ НА 2015 Г.)
1
ПРОГРАММНО-АППАРАТНАЯ ПЛАТФОРМА ARDUINO PRO MINI 16МГц 5В.

miniinthebox.com
350
2
2 КАТУШКИ ЗАЖИГАНИЯ ОТ ВАЗ2108 (27.3706)

Автомагазин

2*500=1000
3
2 ПОЛЕВЫХ ТРАНЗИСТОРА N-КАНАЛА. IRFB3077

Радиорынок
2*300=600
4
КОНВЕРТЕР DC/DC

miniinthebox.com
300
5
ДАТЧИК ХОЛЛА НА ОКУ

Автомагазин
120
6
КОРПУС
Хозяйственный магазин (купил там пластиковый корпус – распред-коробку)
50
7
ПРОВОД 4 КВ. ММ ДЛИННОЙ 2,5 М

Магазин электротоваров
20
8
4 РЕЗИСТОРА 250 мВт 1,8 КОм

В старом телевизоре
Бесплатно
9
2 РЕЗИСТОРА 250 мВт 1 КОм

В старом телевизоре
Бесплатно
10
ПЛАТА ИЗ ГЕТИНАКСА
В старом телевизоре
Бесплатно
11
КРЕПЕЖ
В гараже
Бесплатно
12
РАЗЪЕМНАЯ КОЛОДКА
В старом телевизоре
Бесплатно
Итого: 2440 руб и уйма времени



СБОРКА
1.      Прошей прогу в arduino.
2.      Настрой адаптер питания. Запитай его от аккума на заведенной машине (напряжение около 14 В) и выстави на выходе 5 В. Настройка осуществляется часовой отверточкой плоской.
3.      Собери на плате из гетинакса схему
4.      Закрепи на машине
5.      Проведи провода (от коммутатора к 2-й катушке зажигания проведи провод сечением 4 кв. мм. К 1-й катушке проведи штатный провод (коричневый), провод синий+черный запаяй на выводы Б обоих катушек (+12В ЗАЖИГАНИЕ))
6.      Запаяй провода. Разъем папа-мама на коммутатор лучше не делай – так запаяй. Лучше паянного соединения ничего нет. Массу делай ОДНУ – нак корпус машины в одной точке. Делал для надежности две массы: корпус машины и двигатель и нарвался на сильные наводки.
7.      Трамблер поставь на 2 деления в плюс.


ОПИСАНИЕ РАБОТЫ СИСТЕМЫ, ТЕОРЕТИЧЕСКИЙ БАЗИС

На первичную обмотку катушки зажигания подается кратковременно напряжение от аккумулятора. На вывод Б - +12В от реле зажигания, на вывод К – сток полевого транзистора (при его открытии земля подается, т.е. полевик является силовым ключом). При попадании шторки в щель ДХ он вырабатывает 1, при уходе шторки вырабатывается 0. Этот сигнал принимает 2 цифровой вывод Arduino. Arduino прожевывает этот сигнал и открывает полевики на время не более 10 мс, управление полевиками осуществляется с цифровых выходов 3 и 4. Больше 10 мс катушку запитывать нельзя!!! Иначе она насытится и через первичку пойдет большой постоянный ток (24А), транзистор пробъется и замкнет катушку, катушка взорвется, ПРОВРЕНО!!! За временем насыщения тщательно следит МК.
При появлении сигнала 0 с ДХ должна проскочить искра. Искра формируется в момент закрытия полевика, т.е. при размыкания земли с катушки зажигания. А сам ДХ играется с УОЗ с помощью центробежного регулятора и вакуумного корректора в трамблере – трамблер не трогать, настроен заводом (дойдут руки и до него).
В программе реализован режим защиты от угонщика, режим завода (бегущий УОЗ), режим защиты от перенасыщения катушки зажигания (чтобы не вывести из строя полевик и затем катушку), режим чередующейся искры!!!
Поршни в цилиндрах двигаются синхронно, только в одном поршне происходит взрыв (ВМТ), а в другом конец такта выпуска газов и начало такта впуска топливо-воздушной смеси! А в каком цилиндре сейчас взрыв – не угадаешь. Поэтому по команде водителя МК переходит в режим чередования искры. Если двигатель начинает глохнуть – водитель сообщает об этом МК и чередование изменяется – двигатель восстанавливает обороты. В автомате сделать не получилось, но и так хорошо, а Вам есть над чем подумать.
Сначала для включения режима чередования была кнопка. Но он регулярно давала сбои (как потом разобрался наводка с двигателя, и не только), и слишком резко надо ее было ее нажимать. Догадался использовать еще один ДХ. При попадании в щель шайбочки формируется отличная 1, при вынимании - 0. Этот сигнал подаю на 5 цифровой вход Arduino. Гораздо удобней, чем кнопка!!!



ПОРЯДОК ЭКСПЛУАТАЦИИ

1.      Вынь подсос на середину.
2.      При холодной машине несколько раз интенсивно нажми на педаль газа. Затем вынь шайбочку и заведи машину. Зима кончилась, на холодную заводить не пробывал. При горячей машине просто заведи.
3.      Вставь шабочку, если машина начала глохнуть, тут же ее вынь. Потом, после того как работа двигателя нормализовалась, обратно вставь.
4.      По мере прогревания двигателя плавно убери подсос.


СТОИТ ЛИ ЗАМОРАЧИВАТЬСЯ?

            В горку стала тянуть намного живее. Из грязи отлично выхожу. Субъективно лошадок прибавилось. Замерил расход. Было 4,5 л, стало 4 л на 100 км. Т.е.  упал расход на 10%. Двигатель работает очень хорошо, равномерно. Ни одного выстрела в глушитель. Доработкой доволен.

Фотоматериал:



Сборка

ПРОШИВАЮ



Новый коммутатор

Щель

Система зажигания в сборе

 ИСТОРИЯ РАЗРАБОТКИ


15.12
Собрал схему-прототип на полевиках на 170А 70В мощных: F2907Z.
К сожалению напортачил с прораммой и сжег катушку зажигания - она лопнула!!!
Подал меандр наверно длительностью импульса 1 мс...
Потом исправил прогу, но было поздно.

В силовой цепи полевиков использовать провод потолще - там токи приличные.

Самое главное - завелся!!!! Очень стабильно работает машина - вместо неисправной катушки зажигания применил оковскую. Оборотов 600 в минуту спокойно держит. Докупил катушку зажигания на ВАЗ 2108, позже продолжу. Уже сделаю на постоянку - проведу провода красиво и схемку в коробочку оформлю. Предусмотрю третий полевик для воды.

25.12

Все никак не зафурычит. Сначала распотрошил трамблер. ЦР и ВК убрал. Реализовывал УОЗ программно. Так ничего и недобился...

Купил новый трамблер. Сейчас пытаюсь вернуть, что было. Пока не получается - машина не тянет. Как даешь нагрузку - резко падают обороты.

Теперь рассматриваю вопрос с карбюратором. Хочу старый собрать и поставить.

ОКАЗЫВАЕТСЯ DELAY НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ!!!! ЭТО УЖЕ ПОТОМ ВЫЯСНИЛ. ВОЗНИКАЕТ НЕСИХРОНКА. ПОЧЕМУ НЕ ЗНАЮ.

16.02.15

Стартер не тянул. Втулка улетела, стартер сломался. Купил новый. Втулку сделал латунную. Щас отлично прокручивает и заводится.

17.02

Покатался. Плохо тянет машина. До 50 км/ч еле разгоняюсь. Похоже в момент спада импульса от ДХ должна пробивать искра уже, а у меня только начинается накопление магнитного поля.

01.03.15
Сделал на днях с кнопкой. Кнопкой можно выбирать чередование искр! Стартер опять сломался - взял домой и перепаял - провод отпаялся. С задержкой так ничего и не получилось - сделал на прямую. По фронту-открывает полевики и по спаду закрывает.

05.03.15
Сделал второй ДХ вместо кнопки. Отлично!!! И ничего не нажимается зря!!! С ДХ гораздо удобней включать режим чередования искры.



  БАЗОВЫЕ ПРОШИВКИ РАННИХ ВЕРСИЙ 
(БЕЗ РЕЖИМА ЧЕРЕДОВАНИЯ, С КНОПКОЙ)

На закуску старые базовые прошивки. Работают хорошо:



Версия № 9 (23.02.15)
Синхронно полевики работают. Нет кнопки.
По фронту ДХ накопление при оборотах больше 600.

//искра подается точно по спаду импульса с ДХ. До этого происходит накачка катушки в течение 10 мс или сколько есть времени. При более 4000 об в минуту времени меньше.

int dh = 2;   //вход - датчик холла. спаду импульса (с 1 на 0) должен происходить момент зажигания
int sz1 =  3;  //выходы на полевики свечей зажигания
int sz2 =  4; 
int ind =  13; 
unsigned int zad;
bool dh_old =LOW;//старое и текущее состояние сигнала от ДХ
bool dh_new = LOW;
bool dh_front=LOW;  
bool dh_spad=LOW;//по спаду импульса с дх срабатывает
unsigned long t0;//фиксированный момент времени. Использую для засекания промежутков времени
unsigned long dt;//временной интервал между текущим сигналом с ДХ и предыдущим.
unsigned long oborot;//количество оборотов в минуту
unsigned long oborot_old;
unsigned long i=0;//счетчик оборотов просто
unsigned long j=0;//счетчик оборотов просто

void setup() {
  Serial.begin(115200);
  pinMode(dh, INPUT);      //инициализация входов и выходов
  pinMode(sz1, OUTPUT);    
  pinMode(sz2, OUTPUT);    
  pinMode(ind, OUTPUT); 
  dh_old=digitalRead(dh); 
  digitalWrite(sz1, LOW); //берегу полевики
  digitalWrite(sz2, LOW);
  digitalWrite(ind, LOW);
}

void loop(){
dh_new=digitalRead(dh);   
dh_front=LOW;
dh_spad=LOW;
//ДХ спад
if((dh_new==LOW)&&(dh_old==HIGH)) {
if (digitalRead(ind)) {digitalWrite(ind, LOW);} else {digitalWrite(ind, HIGH);}
dh_spad=HIGH;
dt=millis()-t0;
oborot=60000.0/dt;
if (oborot<150||oborot>6000) {dh_spad=LOW;}//некондиция по оборотам, пропускаю сигнал
if (oborot>3*oborot_old) {dh_spad=LOW;}
t0=millis();
oborot_old=oborot;
}

//ДХ фронт
if((dh_new==HIGH)&&(dh_old==LOW)) {
dh_front=HIGH;
if (oborot<150||oborot>6000) {dh_front=LOW;}//некондиция по оборотам, пропускаю сигнал
if (oborot>3*oborot_old) {dh_front=LOW;}
}

dh_old=dh_new;
////////////////////////////////////////////////////

if(dh_front){//обработка фронта от ДХ
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print("front");Serial.print("\t");Serial.print(i);
if(oborot>=600) {//
//zad=dt-dt/1.5-5.0;
//delay(zad);
//Serial.print("\t");Serial.print(millis());
digitalWrite(sz1, HIGH); //подключаю землю к катушке СРАЗУ
digitalWrite(sz2, HIGH);
//Serial.print("\t");Serial.print(zad);
}//



}


if(dh_spad){//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
i=0;
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print(oborot);Serial.print("\t");Serial.print(dt);
if(oborot<600) {//немножко задерживаюсь перед накачкой катушки, чтобы ее не сжечь
digitalWrite(sz1, HIGH); //формирую импульсы на катушку зажигания
digitalWrite(sz2, HIGH);
delay(4);
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
Serial.print("\t");Serial.print("ot spada 4ms i iskra");
} else {
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
Serial.print("\t");Serial.print("spad, iskra!!!");
}


}



i+=1;


}//loop




Прошивка при использовании кнопки (старая версия № 13):
//при остановке двигателя с вкл. зажиганием если останавливался после фронта и до спада импульса - перегрев транзистора по току (он был открытый). щас устранил. если глохнет, то при оборотах менее 600 искра не вырабатывается.
//после нажатия на кнопку чередования искр звук двигателя меняется!!! не нужен светодиод!!! Добился уменьшением УОЗ где-то на 30 градусов, что соответсвует 3 мс на 1500 оборотах в минуту.
//сама кнопка нажималась!!! щас глянул - наверно где-то перемыкало. нормально стало (28.02.15).
int dh = 2;   //вход - датчик холла. спаду импульса (с 1 на 0) должен происходить момент зажигания
int bt = 5;   //вход - кнопка ненажимающаяся.
int sz1 =  3;  //выходы на полевики свечей зажигания
int sz2 =  4; 
int ind =  13; 
int j;//количество нажатий на кнопку
int i;//пирамидка задержек
bool dh_old =LOW;//старое и текущее состояние сигнала от ДХ
bool dh_new = LOW;
bool dh_front=LOW;  
bool dh_spad=LOW;//по спаду импульса с дх срабатывает
bool bt_old =LOW;
bool bt_new = LOW;
bool bt_ok;//нажата сейчас кнопка
bool first;//чередовать искры
unsigned long t0;//фиксированный момент времени. Использую для засекания промежутков времени
unsigned long t1;
unsigned long dt;//временной интервал между текущим сигналом с ДХ и предыдущим.
unsigned long oborot;//количество оборотов в минуту
unsigned long oborot_old;
//unsigned long i=0;//счетчик оборотов просто

void setup() {
  Serial.begin(115200);
  pinMode(dh, INPUT);      //инициализация входов и выходов
  pinMode(bt, INPUT);     
  pinMode(sz1, OUTPUT);    
  pinMode(sz2, OUTPUT);    
  pinMode(ind, OUTPUT); 
  dh_old=digitalRead(dh); 
  digitalWrite(sz1, LOW); //берегу полевики
  digitalWrite(sz2, LOW);
  digitalWrite(ind, LOW);
  first=HIGH;
  j=0;
  i=16;
}

void loop(){
dh_new=digitalRead(dh);   
bt_new=digitalRead(bt);
dh_front=LOW;
dh_spad=LOW;
bt_ok = LOW;
//ДХ спад
if((dh_new==LOW)&&(dh_old==HIGH)) {
if (digitalRead(ind)) {digitalWrite(ind, LOW);} else {digitalWrite(ind, HIGH);}
dh_spad=HIGH;
dt=millis()-t0;
oborot=60000.0/dt;
if (oborot<150||oborot>6000) {dh_spad=LOW;}//некондиция по оборотам, пропускаю сигнал
if (oborot>3*oborot_old) {dh_spad=LOW;}
t0=millis();
oborot_old=oborot;
}

//ДХ фронт
if((dh_new==HIGH)&&(dh_old==LOW)) {
dh_front=HIGH;
if (oborot<150||oborot>6000) {dh_front=LOW;}//некондиция по оборотам, пропускаю сигнал
if (oborot>3*oborot_old) {dh_front=LOW;}
}

if((bt_new==HIGH)&&(bt_old==LOW)) {
j+=1;//считаю количество нажатий на кнопку
bt_ok = HIGH;
//if ((millis()-t1<300)&&(millis()<500)) {bt_ok = LOW;j-=1;}
if (millis()<500) {bt_ok = LOW;j-=1;}
t1=millis();
}



dh_old=dh_new;
bt_old=bt_new;
////////////////////////////////////////////////////



if(j==0){//j=0

if(dh_front){//обработка фронта от ДХ
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print("front");
}

if(dh_spad){//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print(oborot);Serial.print("\t");Serial.print(dt);
digitalWrite(sz1, HIGH); //формирую импульсы на катушку зажигания
digitalWrite(sz2, HIGH);
delay(i);
if (i>2) {i-=1;}
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
Serial.print("\t");Serial.print("ot spada 2ms i iskra");
}//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ

}//j=0



///////////////////////////////////////////////////////////////////////////////////
if(j>0){//кнопка нажата хоть один раз
if((millis()<300000)&&bt_ok) {first=!first;Serial.println("");Serial.print("najatie");Serial.print("\t");Serial.print(j);}


if(dh_front){//обработка фронта от ДХ
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print("front");
if (oborot>600) {if(first) {digitalWrite(sz1, HIGH);Serial.print("\t");Serial.print("1 svecha");} else {digitalWrite(sz2, HIGH);Serial.print("\t");Serial.print("2 svecha");}} //подключаю землю к катушке СРАЗУ
}

if(dh_spad){//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
Serial.println("");
Serial.print(millis());Serial.print("\t");Serial.print(oborot);Serial.print("\t");Serial.print(dt);
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
Serial.print("\t");Serial.print("spad, iskra!!!");
first=!first;//реализация чередования искр
}//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
}//кнопка нажата хоть один раз


}//loop