а как по оптике диагностику делать? по кану - нет проблем.
Для начала не обязательно покупать дорогостоящие трансиверы можно поэксперементировать с тем что есть ниже опишу как из ИК диода и ИК передатчика сделать простой трансивер: Берем ИК диод Надеваем на него трубочку
Получаем Приемник оптический берем оптовоконный кабель
отрезаем несколько жил собираем термоусадкой
ПОЛУЧАЕМ
Кабелек Берем ИК диод или пульт для тестов
так же одеваем трубочку
Подключаем
Тестим
Все просто вот скетч для пробы писать отдельный не стал разместил тот что был
PHP код:
/*
The circuit:
* LCD RS pin to digital pin 9
* LCD Enable pin to digital pin 7
* LCD R/W pin to digital pin 8
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* 10K resistor GND: to pin 3 LCD
* LCD 1 & 16 to ground
* LCD 2 & 15 +5V
* wiper to LCD VO pin (pin 3)
* ir_pin = 6
*/
#include <OneWire.h>
OneWire ds(10); // линия 1-Wire будет на pin 9
int ir_pin = 6; //Sensor pin 1 wired through a 220 ohm resistor
int ledPin = 12; //"Ready to Recieve" flag, not needed but nice
int debug = 0; //Serial connection must be started to debug
int start_bit = 2000; //Start bit threshold (Microseconds)
int bin_1 = 1000; //Binary 1 threshold (Microseconds)
int bin_0 = 400; //Binary 0 threshold (Microseconds)
#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 8, 7, 5, 4, 3, 2);
const int numRows = 4;
const int numCols = 20;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ir_pin, INPUT);
lcd.begin(numRows, numCols);
lcd.setCursor(0, 0);
lcd.print("Rem Demo v.2.0");
delay(3000);
lcd.setCursor(0, 0);
lcd.print(":-) ");
}
void loop() {
byte i;
byte present = 0;
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
ds.reset_search();
return;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
lcd.setCursor(0, 0);
lcd.print("Not Connect!");
return;
}
if ( addr[0] != 0x28) {
lcd.print("Device is not a DS18b20 family device.\n");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // запускаем конвертацию
delay(10); // скорее всего достаточно 750ms
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // считываем ОЗУ датчика
for ( i = 0; i < 9; i++) { // обрабатываем 9 байт
data[i] = ds.read();
}
// высчитываем температуру :)
int HighByte, LowByte, TReading, Tc_100;
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
Tc_100 = TReading/2;
lcd.setCursor(10, 1);
lcd.print("t.=");
lcd.print(Tc_100);
start:
int key = getIRKey(); //Fetch the key
/* lcd.setCursor(0, 1);
lcd.print("Key set:");
lcd.print(key);
lcd.print(" ");
*/
switch (key){
case 224:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Menu:");
delay(500);
goto menu;
break;
case 950:
lcd.setCursor(0, 1);
lcd.print("Tools");
digitalWrite(ledPin, HIGH);
break;
case 931:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("IR Test");
digitalWrite(ledPin, LOW);
lcd.setCursor(0, 1);
lcd.print(" ");
break;
case 180:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("left");
break;
case 179:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("right");
break;
case 244:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("up");
break;
case 245:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("down");
break;
case 184:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("HI");
break;
menu:
int key = getIRKey(); //Fetch the key
/* lcd.setCursor(0, 1);
lcd.print("Key set:");
lcd.print(key);
lcd.print(" ");
*/
if(key=950){
digitalWrite(ledPin, LOW);
delay(300);
goto start;}
else;
goto menu;
}
}
int getIRKey() {
int data[12];
//Ok, i'm ready to recieve
while(pulseIn(ir_pin, LOW) < 2200) { //Wait for a start bit
}
data[0] = pulseIn(ir_pin, LOW); //Start measuring bits, I only want low pulses
data[1] = pulseIn(ir_pin, LOW);
data[2] = pulseIn(ir_pin, LOW);
data[3] = pulseIn(ir_pin, LOW);
data[4] = pulseIn(ir_pin, LOW);
data[5] = pulseIn(ir_pin, LOW);
data[6] = pulseIn(ir_pin, LOW);
data[7] = pulseIn(ir_pin, LOW);
data[8] = pulseIn(ir_pin, LOW);
data[9] = pulseIn(ir_pin, LOW);
data[10] = pulseIn(ir_pin, LOW);
data[11] = pulseIn(ir_pin, LOW);
if(debug == 1) {
lcd.setCursor(0, 1);
lcd.println("-----");
}
for(int i=0;i<11;i++) { //Parse them
if (debug == 1) {
lcd.println(data[i]);
}
if(data[i] > bin_1) { //is it a 1?
data[i] = 1;
} else {
if(data[i] > bin_0) { //is it a 0?
data[i] = 0;
} else {
data[i] = 2; //Flag the data as invalid; I don't know what it is!
}
}
}
for(int i=0;i<11;i++) { //Pre-check data for errors
if(data[i] > 1) {
return -1; //Return -1 on invalid data
}
}
int result = 0;
int seed = 1;
for(int i=0;i<11;i++) { //Convert bits to integer
if(data[i] == 1) {
result += seed;
}
seed = seed * 2;
}
return result; //Return key number
}
Последний раз редактировалось xeonlink; 10.09.2010 в 11:25.
"Смотри Выше, тем более диагностика не нужна будет все данные будут на Дисплее Автомобиля по не неисправностям выдаваться"
- а каким образом с датчика получить неисправность для вывода на дисплей? алгоритм? согласен с Гуру vS полностью - тем более - что неисправность фиксируют "мозги", для всех - алгоритм свой - как отсутствие сигнала, так и сигнал "не в допуске", да ещё и при совокупности параметров от других датчиков. "Мозгов" в современных авто - много, и связаны они именно по CAN. Да и один и тот же датчик часто завязан на разные системы и сочетание ошибок по разным системам выдает разные коды и сиптоматика может отличаться.
Последний раз редактировалось zlay@; 09.09.2010 в 19:45.
Мы не делаем оптику на все датчики а только между модулями например модуль управления освещением, модуль управления системой помощи при парковке, модуль управления системой комфорт (зеркала стеклоподъемники центр замок и т.д./т.п. Ну допустим дорого покупать лазерные трансиверы сделаем Инфракрасные по оптике пустим суть не меняется
так ведь дороже кан шину делать чем оптику и обвязка нужна большая и геморойно это
Последний раз редактировалось xeonlink; 09.09.2010 в 20:08.
мы здесь делаем блок управления КУЗОВОМ а не ДВС АИРБАГ И КПП зачем нам датчики двс от них можно получить данные множеством способов например используя ELM 327 http://carmonitor.ru/ru/2usbelm327v13-p-56.html В начале же написано делаем свой алгоритм определения неисправности и свои коды ошибок на русском языке с выводом на дисплей
Предложение использовать протокол ИК пульта от телевизоров сони
А вот и скетч Для отправляющейБиблиотека для работы с протоколом СОНИ в комплектеPHP код:
/*
* IR LED must be connected to Arduino PWM pin 3.
*/
#include <IRremote.h>
int button = 12;
int button2 = 11;
IRsend irsend;
int val;
void setup()
{
pinMode(button, INPUT);
pinMode(button2, INPUT);
}
void loop() {
val = digitalRead(button);
if (val == 0) {
irsend.sendSony(0xa90, 12);} // Sony TV power code
delay(10);
val = digitalRead(button2);
if (val == 0) {
irsend.sendSony(0xa70, 12);} // Sony TV power code
delay(10);
}
Для Принимающей АрдуиныPHP код:
/*
The circuit:
* LCD RS pin to digital pin 9
* LCD Enable pin to digital pin 7
* LCD R/W pin to digital pin 8
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* 10K resistor GND: to pin 3 LCD
* LCD 1 & 16 to ground
* LCD 2 & 15 +5V
* wiper to LCD VO pin (pin 3)
* ir_pin = 6
*/
int ir_pin = 6; //"Ready to Recieve" flag, not needed but nice //Serial connection must be started to debug
int start_bit = 2000; //Start bit threshold (Microseconds)
int bin_1 = 1000;
int debug = 0; //Binary 1 threshold (Microseconds)
int bin_0 = 400; //Binary 0 threshold (Microseconds)
#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 8, 7, 5, 4, 3, 2);
const int numRows = 2;
const int numCols = 16;
void setup() {
pinMode(ir_pin, INPUT);
lcd.begin(numRows, numCols);
lcd.setCursor(0, 0);
lcd.print("Rem Demo v.2.0");
delay(3000);
lcd.setCursor(0, 0);
lcd.print(":-) ");
}
void loop() {
int key = getIRKey(); //Fetch the key
lcd.setCursor(0, 1);
lcd.print("Key set:");
lcd.print(key);
lcd.print(" ");
}
int getIRKey() {
int data[12];
//Ok, i'm ready to recieve
while(pulseIn(ir_pin, LOW) < 2200) { //Wait for a start bit
}
data[0] = pulseIn(ir_pin, LOW); //Start measuring bits, I only want low pulses
data[1] = pulseIn(ir_pin, LOW);
data[2] = pulseIn(ir_pin, LOW);
data[3] = pulseIn(ir_pin, LOW);
data[4] = pulseIn(ir_pin, LOW);
data[5] = pulseIn(ir_pin, LOW);
data[6] = pulseIn(ir_pin, LOW);
data[7] = pulseIn(ir_pin, LOW);
data[8] = pulseIn(ir_pin, LOW);
data[9] = pulseIn(ir_pin, LOW);
data[10] = pulseIn(ir_pin, LOW);
data[11] = pulseIn(ir_pin, LOW);
if(debug == 1) {
lcd.setCursor(0, 1);
lcd.println("-----");
}
for(int i=0;i<11;i++) { //Parse them
if (debug == 1) {
lcd.println(data[i]);
}
if(data[i] > bin_1) { //is it a 1?
data[i] = 1;
} else {
if(data[i] > bin_0) { //is it a 0?
data[i] = 0;
} else {
data[i] = 2; //Flag the data as invalid; I don't know what it is!
}
}
}
for(int i=0;i<11;i++) { //Pre-check data for errors
if(data[i] > 1) {
return -1; //Return -1 on invalid data
}
}
int result = 0;
int seed = 1;
for(int i=0;i<11;i++) { //Convert bits to integer
if(data[i] == 1) {
result += seed;
}
seed = seed * 2;
}
return result; //Return key number
}
Последний раз редактировалось xeonlink; 10.09.2010 в 11:27.
так ведь все современные машины УЖЕ имеют кан - его не нужно делать! и свет, а\с и пр. - тоже сидят на кане. и имеют выводимые коды неисправности. подобие кана уже и ВАЗ делает. (у микросхемы 8 ножек и 2 ручки для переноски )
смысл дублировать уже имеющиеся системы??
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)