Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Чт ноя 19, 2015 18:15:00
Пауза - это высокий уровень. По умолчанию на линии - высокий уровень. Импульс - низкий уровень. На практике вышло так. По описанию - да, все как ты говоришь, и Mishany говорил, и wheelremote пишет. Короче, все так, как в описании, но уровни надо инвертировать))) я не знаю, как проще сказать)) Схема подключения кана в скетче, на 4-ю ногу ардуины повесил вывод на remote_cont, все работает. Сегодня как раз пришла последняя запчасть - can-модуль от китайцев, подружу его с pro-mini и l7805 и будет готовое устройство) как будет готово - выложу.
Скетч полностью готов к употреблению, реализована функция ATT при включении задней передачи.
Спойлер
// Version 1.0, фильтр CAN с последующей передачей IR-кода
#include <SPI.h>
#include "mcp_can.h"
#define outputPin 4 // remote_cont
unsigned int VOL_UP[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,1,0};
unsigned int VOL_DN[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,1,0,1,0};
unsigned int MUTE[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,1,0,1,0};
unsigned int SOURCE[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0,1,0,1,0};
unsigned int SEEK_UP[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0};
unsigned int TRK_UP[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,0,1,0};
unsigned int TRK_DN[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,1,0,1,0,1,0};
unsigned int DISC_UP[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0};
unsigned int DISC_DN[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0};
unsigned int ANSWER[49] = {0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0};
int reverse = 0;
unsigned long last_time;
// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 9;
MCP_CAN CAN(SPI_CS_PIN); // Set CS pin
void setup()
{
Serial.begin(115200);
pinMode(outputPin, OUTPUT);
digitalWrite(outputPin, HIGH);
Serial.println("start");
START_INIT:
if(CAN_OK == CAN.begin(CAN_100KBPS)) // init can bus : baudrate = 100k
{
Serial.println("CAN BUS Shield init ok!");
}
else
{
Serial.println("CAN BUS Shield init fail");
Serial.println("Init CAN BUS Shield again");
delay(100);
goto START_INIT;
}
}
boolean send(unsigned int *command)
{
digitalWrite(outputPin, LOW);
delay(10);
digitalWrite(outputPin, HIGH);
delayMicroseconds(4500);
for (int x = 0; x < 49; x++)
{
if (command[x] == 0)
{
digitalWrite(outputPin, LOW);
}
else
{
digitalWrite(outputPin, HIGH);
}
delayMicroseconds(1000);
digitalWrite(outputPin, HIGH);
delayMicroseconds(200);
}
}
void loop()
{
unsigned char len = 0;
unsigned char buf[8];
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
unsigned long canId = CAN.getCanId();
if((canId = 0x5C1)&&(len=4)&&(buf[1]==0)&&(buf[2]==0)&&(buf[3]==0x20)) //((buf[0]==0x06)||(buf[0]==0x07)||(buf[0]==0x02)||(buf[0]==0x03)||(buf[0]==0x1A)||(buf[0]==0x2B))&&
{
if(last_time<millis())
{
switch (buf[0])
{
case 0x06: // Vol_Up
Serial.println("Volume UP");
send(VOL_UP); //отправка кода(адрес, команда)
break;
case 0x07: // Vol_Down
Serial.println("Volume Down");
send(VOL_DN); //отправка кода(адрес, команда)
break;
case 0x1A: // Phone
Serial.println("Phone Btn");
send(SOURCE); //отправка кода(адрес, команда)
break;
case 0x02: // UP (0x22)
Serial.println("Track UP");
send(TRK_UP); //отправка кода(адрес, команда)
break;
case 0x03: // Down (0x23)
Serial.println("Track Down");
send(TRK_DN); //отправка кода(адрес, команда)
break;
case 0x2B: //Mute
Serial.println("Mute");
send(MUTE); //отправка кода(адрес, команда)
break;
default:
// if nothing else matches, do the default
// default is optional
break;
}
last_time=millis()+40;
}
}
if((canId = 0x470)&&(len=8)&&(buf[3]==0x46)&&(buf[4]==0)&&(buf[5]==0)&&(buf[6]==0)&&(buf[7]==0x1F)) //Включение задней передачи
{
/*for(int i=0; i<8; i++)
{
Serial.print(buf[i], HEX);
Serial.print('\t');
}
Serial.println("");*/
if(((buf[0]==0xC0)||(buf[0]==0x40))&&(reverse==1)) //задняя не включена и предыдущее значение 1
{
reverse=0;
Serial.println("Reverse Disabled");
send(MUTE);
}
if(((buf[0]==0xE0)||(buf[0]==0x60))&&(reverse==0))
{
reverse=1;
Serial.println("Reverse Enabled");
send(MUTE);
}
}
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/