\#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ä 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 //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ä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() { laskuri = 0; //Yritetään lukea moottorinohjaimen CAN-viestiä niin kauan että juuri //se viesti saadaan, TAI kunnes laskuri ylittää säädetyn arvon. //Laskuri tarvitaan, jottei muu toiminta jäisi jumiin jos viestiä //ei jostain syystä saada EI KÄYTÃ--SSÄ\!\! //do{ CAN.readDATA_ff_1(&rx_len, rx_msg, &rx_id); // luetaan CAN-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ä 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ä // lähetetään CAN-viestin tiedot moodeemilla } //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 if(rx_id == 167248164) { viesti7 = rx_msg\[0\]; viesti8 = rx_msg\[1\]; viesti9 = rx_msg\[2\]; viesti10 = rx_msg\[3\]; } Serial.println(1, DEC); Serial.println(2, DEC); Serial.println(viesti1, DEC); Serial.println(viesti2, DEC); Serial.println(viesti3, DEC); Serial.println(viesti4, DEC); Serial.println(viesti5, DEC); Serial.println(viesti6, DEC); Serial.println(viesti7, DEC); Serial.println(viesti8, DEC); Serial.println(viesti9, DEC); Serial.println(viesti10, DEC); //DEBUG //Serial.println(CAN_kaasu, BYTE); //Serial.println(PWM_suunta, BYTE); //Serial.println(PWM_kauha, BYTE); //Serial.println(MoottoriOnOff, BYTE); //tartteeko tätä? //delay(10); int Check1 = SWread(); 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 int Check2 = SWread(); if(Check1==2 && Check2==3) { // 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, 0x65, candata); //65 = MOOTTORIN ID CAN.send_0(); }//CHECKIN LOPETUS } // 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; }