\#include <SPI.h>
\#include <SoftwareSerial.h>
\#include <CAN.h>
\#define BAUDRATE 250
//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 viesti7 = 0;
byte viesti8 = 0;
byte viesti9 = 0;
byte viesti10 = 0;
byte viesti;
// laskuri CAN:lle
int laskuri;
//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;
//Ajetaan kerran Arduinon käynnistyessäkäynnistyessä
void setup()
{
//CAN setup
CAN.begin(); //CANin alustus, alustaa samalla myösmyös SPI:n
CAN.baudConfig(BAUDRATE); //asettaa baudraten 125kbit/s
CAN.setMode(NORMAL); //asettaa CAN moden
//datan nollaukset
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änsarjaväylän alustus
pinMode(suuntaPin, OUTPUT); // pwm lähtölähtö suunnalle outputiksi
pinMode(kauhaPin, OUTPUT); // pwm lähtölähtö kauhalle outputiksi
// sarjaväylänsarjavä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()
{
laskuri = 0;
//YritetäänYritetään lukea moottorinohjaimen CAN-viestiäviestiä niin kauan ettäettä juuri
//se viesti saadaan, TAI kunnes laskuri ylittääylittää säädetynsäädetyn arvon.
//Laskuri tarvitaan, jottei muu toiminta jäisijäisi jumiin jos viestiäviestiä
//ei jostain syystäsyystä saada EI KÄYTÃ--SSÄ\KÄYTÖSSÄ!\!
//do{
CAN.readDATA_ff_1(&rx_len, rx_msg, &rx_id); // luetaan CAN-väylää
väylää
laskuri++;
// }while(rx_id\!=0x66 && rx_id\!=167248164 && laskuri<15); //kuuluuko olla && vai \|\|
//
//jos CAN viestin ID 0x66, luetaan viestin kuusi ensimmäistäensimmäistä alkiota muuttujiin
if(rx_id==0x00000066)
{
viesti1 = rx_msg\[0\]; // RPM / 8 eniten merkitseväämerkitsevää bittiä
bittiä
viesti2 = rx_msg\[1\]; // RPM / 8 vähitenvähiten merkitseväämerkitsevää bittiä
bittiä
viesti3 = rx_msg\[2\]; // akun jännitejännite / 8 eniten merkitseväämerkitsevää bittiäbittiä
viesti4 = rx_msg\[3\]; // akun jännitejännite / 8 vähitenvähiten merkitseväämerkitsevää bittiä
bittiä
viesti5 = rx_msg\[4\]; // moottorin virta / 8 eniten merkitseväämerkitsevää bittiä
bittiä
viesti6 = rx_msg\[5\]; // moottorin virta / 8 vähitenvähiten merkitseväämerkitsevää bittiä
// lähetetäänbittiä
// lähetetään CAN-viestin tiedot moodeemilla
}
//TÄNNE //TÄNNE GEPSIN LUKEMINEN. LISÄÄ MYÃ--SLISÄÄ MYÖS GEPSITIETOJEN LÄHETYSLÄ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
if
if(rx_id == 167248164)
{
viesti7 {
viesti7 = rx_msg\[0\];
viesti8 viesti8 = rx_msg\[1\];
viesti9 viesti9 = rx_msg\[2\];
viesti10 = viesti10 = rx_msg\[3\];
}
}
Serial.println(1, DEC);
Serial.println(2 Serial.println(2, DEC);
Serial.println(viesti1, DEC);
Serial Serial.println(viesti1viesti2, DEC);
Serial Serial.println(viesti2viesti3, DEC);
Serial Serial.println(viesti3viesti4, DEC);
Serial Serial.println(viesti4viesti5, DEC);
Serial Serial.println(viesti5viesti6, DEC);
Serial Serial.println(viesti6viesti7, DEC);
Serial Serial.println(viesti7viesti8, DEC);
Serial Serial.println(viesti8viesti9, DEC);
Serial Serial.println(viesti9viesti10, DEC);
//DEBUG
//Serial.println(viesti10CAN_kaasu, DEC);
//DEBUG
//BYTE);
//Serial.println(CANPWM_kaasusuunta, BYTE);
//Serial.println(PWM_suunta, BYTE);
//Serial.println(PWM_kauha, BYTE);
//Serial.println(MoottoriOnOff, BYTE);
//tartteeko tätätätä?
//delay(10);
int Check1 = SWread();
CAN CAN_kaasu = SWread(); // luetaan radiomodeemin ensimmäinenensimmäinen viesti = kaasu
PWM PWM_suunta = SWread(); // luetaan radiomodeemin toinen viesti = suunta
PWM PWM_kauha = SWread(); // luetaan radiomodeemin kolmas viesti = kauha
MoottoriOnOff MoottoriOnOff = SWread(); // // luetaan radiomodeemin neljäsneljäs viesti = moottorin ON/OFF tieto
int Check2 = SWread();
if(Check1==2 && Check2 if(Check1==2 && Check2==3)
{
// {
// annetaan arvot pwm lähdöille
analogWritelähdöille
analogWrite(suuntaPin, PWM_suunta);
analogWrite analogWrite(kauhaPin, PWM_kauha);
//Pitääkö MoottoriOnOff-viestiä
//Pitääkö MoottoriOnOff-viestiä pommittaa koko ajan ettei moottori sammu???
if if(MoottoriOnOff \!= MoottoriVanha)
{
if {
if(MoottoriOnOff == 0x51) // Moottori päälle
{
// lähetetäänpäälle
{
// lähetetään CAN-viesti moottori päälle
candata_OnOff\[0\päälle
candata_OnOff[0] = 0x01;
CAN.load_ff_0(8, id_OnOff, candata_OnOff);
CAN.send_0();
}
else 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);
}
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
arvo oikeaan muotoon
// ja lähetetäänlähetetään se CAN-viestinäviestinä moottorille
kaasu kaasu = 0x8000-(12*(CAN_kaasu*10));
candata\[0\] = kaasu >> 8;
candata\[1\ candata[0] = kaasu >> 8;
candata[1] = kaasu & 0xFF;
candata\[2\ candata[2] = 0x00;
CAN CAN.load_ff_0(8, 0x65, candata); //65 = MOOTTORIN ID
CAN; //65 = MOOTTORIN ID
CAN.send_0();
}//CHECKIN LOPETUS
}
// funktio radiomodeemin lukemiseen
int SWread()
{
byte byte val = 0;
while while (digitalRead(rx));
if if (digitalRead(rx) == LOW) {
delayMicroseconds delayMicroseconds(Delay / 2 - clockCyclesToMicroseconds(50));
for for(int offset = 0; offset < 8; offset++) {
delayMicroseconds delayMicroseconds(Delay);
val \ val |= digitalRead(rx) << offset;
}
}
//wait for stop bit + extra
delayMicroseconds
delayMicroseconds(bitDelay);
return return val;
}
}
//return \-1;
}
|