-
Created by Unknown User (tonini), last modified by Unknown User (m0702487) on 27.9.2012
You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 5
Next »
#include <SPI.h>
#include <SoftwareSerial.h>
#include <CAN.h>
#define BAUDRATE 125
//CAN muuttujat
byte candata[8];
byte candata_OnOff[0];
unsigned long id_Kaasu=0x65;
unsigned long id_OnOff=0x64;
byte rx_len;
byte rx_msg[8]={0};
unsigned long rx_id;
byte viesti1=0;
byte viesti2=0;
byte viesti3=0;
byte viesti4=0;
byte viesti5=0;
byte viesti6=0;
byte viesti;
//RS232 muuttujat
byte rx = 0;
byte tx = 1;
byte CAN_kaasu;
byte PWM_suunta=30;
byte PWM_kauha=30;
byte MoottoriOnOff=0;
byte MoottoriVanha;
signed int Kaasu;
int bitDelay;
int Delay;
int suuntaPin = 6;
int kauhaPin = 9;
void setup()
{
//CAN setup
CAN.begin(); //CANin alustus, alustaa samalla myös SPI:n
CAN.baudConfig(BAUDRATE); //asettaa baudraten 125kbit/s
CAN.setMode(NORMAL); //asettaa CAN moden
candata[0]=0x00;
candata[1]=0x00;
candata[2]=0x00;
candata[3]=0x00;
candata[4]=0x00;
candata[5]=0x00;
candata[6]=0x00;
candata[7]=0x00;
candata_OnOff[0]=0x00;
candata_OnOff[1]=0x00;
candata_OnOff[2]=0x00;
candata_OnOff[3]=0x00;
candata_OnOff[4]=0x00;
candata_OnOff[5]=0x00;
candata_OnOff[6]=0x00;
candata_OnOff[7]=0x00;
Serial.begin(9600); //sarjaväylän alustus
pinMode(suuntaPin, OUTPUT); // pwm lähtö suunnalle outputiksi
pinMode(kauhaPin, OUTPUT); // pwm lähtö kauhalle outputiksi
// sarjaväylän alustus radio modeemeille
pinMode(rx,INPUT);
pinMode(tx,OUTPUT);
digitalWrite(tx,HIGH);
bitDelay=1000000 / 9600;
Delay = bitDelay - clockCyclesToMicroseconds(50);
delayMicroseconds(bitDelay);
}
void loop()
{
CAN.readDATA_ff_1(&rx_len, rx_msg, &rx_id); // luetaan CAN-väylää
//jos CAN viestin ID 0x66, luetaan viestin kuusi ensimmäistä alkiota muuttujiin
if(rx_id==0x00000066)
{
viesti1=rx_msg[0]; // RPM / 8 eniten merkitsevää bittiä
viesti2=rx_msg[1]; // RPM / 8 vähiten merkitsevää bittiä
viesti3=rx_msg[2]; // akun jännite / 8 eniten merkitsevää bittiä
viesti4=rx_msg[3]; // akun jännite / 8 vähiten merkitsevää bittiä
viesti5=rx_msg[4]; // moottorin virta / 8 eniten merkitsevää bittiä
viesti6=rx_msg[5]; // moottorin virta / 8 vähiten merkitsevää bittiä
}
//TÄNNE GEPSIN LUKEMINEN. LISÄÄ MYÖS GEPSITIETOJEN LÄHETYS (VIESTI7...)
//heading_radians = (unsigned int)(radian(heading)*10000);
//speed_metres = (unsigned int)(speed*0.5144*100);
//nmea2000_buffer[0] = (unsigned char)(fix); // position fix
//nmea2000_buffer[1] = 0xfc; // 11111100 True heading 00 + resv 6 bits
//nmea2000_buffer[2] = (unsigned char)(heading_radians >> 0);
//nmea2000_buffer[3] = (unsigned char)(heading_radians >> 8);
//nmea2000_buffer[4] = (unsigned char)(speed_metres >> 0);
//nmea2000_buffer[5] = (unsigned char)(speed_metres >> 8);
//nmea2000_buffer[6] = 0xff; // resv 8 bits
//nmea2000_buffer[7] = 0xff; // resv 8 bits
//FIX ON OIKEASTI BOOL-TYYPPINEN JA KERTOO, SAAKO GPS YHTEYDEN SATELLIITTEIHIN, TS. ONKO TIETO LUOTETTAVAA
//uncommentaa seuraavat
/*
if(rx_id==ID_GPS)
{
viesti7=rx_msg[2];
viesti8=rx_msg[3];
viesti9=rx_msg[4];
viesti10=rx_msg[5];
}*/
delay(10);
CAN_kaasu=SWread(); // luetaan radiomodeemin ensimmäinen viesti = kaasu
PWM_suunta=SWread(); // luetaan radiomodeemin toinen viesti = suunta
PWM_kauha=SWread(); // luetaan radiomodeemin kolmas viesti = kauha
MoottoriOnOff=SWread(); // // luetaan radiomodeemin neljäs viesti = moottorin ON/OFF tieto
// lähetetään CAN-viestin tiedot moodeemilla
Serial.println(viesti1, BYTE);
Serial.println(viesti2, BYTE);
Serial.println(viesti3, BYTE);
Serial.println(viesti4, BYTE);
Serial.println(viesti5, BYTE);
Serial.println(viesti6, BYTE);
// annetaan arvot pwm lähdöille
analogWrite(suuntaPin, PWM_suunta);
analogWrite(kauhaPin, PWM_kauha);
//Pitääkö MoottoriOnOff-viestiä pommittaa koko ajan ettei moottori sammu???
if(MoottoriOnOff!=MoottoriVanha)
{
if (MoottoriOnOff==0x51) // Moottori päälle
{
// lähetetään CAN-viesti moottori päälle
candata_OnOff[0]=0x01;
CAN.load_ff_0(8,id_OnOff,candata_OnOff);
CAN.send_0();
}
else if (MoottoriOnOff==0x50) // Moottori pois päältä
{
// lähetetään CAN-viesti moottori pois päältä
candata_OnOff[0]=0x00;
CAN.load_ff_0(8,id_OnOff,candata_OnOff);
CAN.send_0();
}
MoottoriVanha=MoottoriOnOff;
//Pitääkö CAN-viestien välillä olla viive?
delay(10);
}
// lasketaan radiomoodemilta saatu kaasun arvo oikeaan muotoon
// ja lähetetään se CAN-viestinä moottorille
Kaasu=0x8000-(12*(CAN_kaasu*10));
candata[0]=Kaasu>>8;
candata[1]=Kaasu & 0xFF;
candata[2]=0x00;
CAN.load_ff_0(8,id_Kaasu,candata);
CAN.send_0();
}
// funktio radiomodeemin lukemiseen
int SWread()
{
byte val = 0;
while (digitalRead(rx));
if (digitalRead(rx) == LOW) {
delayMicroseconds(Delay / 2 - clockCyclesToMicroseconds(50));
for (int offset = 0; offset < 8; offset++) {
delayMicroseconds(Delay);
val |= digitalRead(rx) << offset;
}
//wait for stop bit + extra
delayMicroseconds(bitDelay);
return val;
}
//return -1;
}
You must log in to comment.