durk-cut | Дата: Четверг, 15.06.2017, 12:26 | Сообщение # 1 |
3.5 Вольт
Группа: Пользователи
Сообщений: 10
Репутация: 0
Статус: Offline
| Случилась известная проблема с трансивером Icom IC-732 потек дисплей. Вариант заказа конечно монитрорится, но вещь достаточно редкая. Поиск по теме дал интересные ссылки. По первой ссылке приставка к трансиверу, там же есть прошивка http://radiodv.net/my_icom_civ.php , по второй адаптация кода для ардуино http://darkbyte.ru/2016/92/arduino-cat-ci-v-interface-for-icom-ic-820/. Цель объединить в ардуино управление трансивером по CAT с компьютера и индикацию на дисплее частоты и режима работы. С индикацией боле менее получилось, а вот данные аппаратный uart в софтовый и обратно не шлет, или шлет но не верные. В скетче конечно много лишнего, но я начинающий и пока слабо понимаю, что там за что отвечает))) #include <LiquidCrystal_I2C.h> #include <Wire.h> #include <SoftwareSerial.h> SoftwareSerial CAT(10, 11); // RX, TX LiquidCrystal_I2C lcd(0x27, 16, 2);
//#define DEBUG 1
#define BROADCAST_ADDRESS 0x00 //Broadcast address #define CONTROLLER_ADDRESS 0xE0 //Controller address
#define START_BYTE 0xFE //Start byte #define STOP_BYTE 0xFD //Stop byte
#define CMD_TRANS_FREQ 0x00 //Transfers operating frequency data #define CMD_TRANS_MODE 0x01 //Transfers operating mode data
#define CMD_READ_FREQ 0x03 //Read operating frequency data #define CMD_READ_MODE 0x04 //Read operating mode data
#define CMD_WRITE_FREQ 0x05 //Write operating frequency data #define CMD_WRITE_MODE 0x06 //Write operating mode data
const uint32_t decMulti[] = {1000000000, 100000000, 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1}; const uint16_t baudRates[] = {19200, 9600, 4800, 1200};
uint8_t radio_address; //Transiever address uint16_t baud_rate; //Current baud speed uint32_t readtimeout; //Serial port read timeout uint8_t read_buffer[12]; //Read buffer uint32_t frequency; //Current frequency in Hz
const char* mode[] = {"LSB","USB","AM","CW","FSK","FM","WFM"};
void configRadioBaud(uint16_t baudrate) { if(baud_rate != baudrate){ CAT.end(); CAT.begin(baudrate); } baud_rate = baudrate;
switch (baud_rate) { case 4800: readtimeout = 50000; break; case 9600: readtimeout = 40000; break; case 19200: readtimeout = 30000; break; default: readtimeout = 100000; break; } }
uint8_t readLine(void) { uint8_t byte; uint8_t counter = 0; uint32_t ed = readtimeout;
while (true) { while (!CAT.available()) { if (--ed == 0)return 0; } ed = readtimeout; byte = CAT.read(); //Serial.print(byte); if (byte == 0xFF)continue; //TODO skip to start byte instead Serial.print(byte); read_buffer[counter++] = byte; if (STOP_BYTE == byte) break;
if (counter >= sizeof(read_buffer))return 0; } return counter; }
void sendCatRequest(uint8_t requestCode) { uint8_t req[] = {START_BYTE, START_BYTE, radio_address, CONTROLLER_ADDRESS, requestCode, STOP_BYTE}; #ifdef DEBUG Serial.print(">"); #endif for (uint8_t i = 0; i < sizeof(req); i++) { CAT.write(req); #ifdef DEBUG if (req < 16)Serial.print("0"); Serial.print(req, HEX); Serial.print(" "); #endif } #ifdef DEBUG Serial.println(); #endif }
bool searchRadio() {
for(uint8_t baud=0; baud<sizeof(baudRates); baud++){ #ifdef DEBUG Serial.print("Try baudrate "); Serial.println(baudRates[baud]); #endif configRadioBaud(baudRates[baud]); sendCatRequest(CMD_READ_FREQ); if (readLine() > 0) { if(read_buffer[0]==START_BYTE && read_buffer[1]==START_BYTE){ radio_address = read_buffer[3]; } return true; } }
radio_address = 0xFF; return false; }
void printFrequency(void) {
frequency = 0; //FE FE E0 42 03 <00 00 58 45 01> FD for (uint8_t i = 0; i < 5; i++) { if(read_buffer[9 - i] == 0xFD)continue; #ifdef DEBUG if (read_buffer[9 - i] < 16)Serial.print("0"); Serial.print(read_buffer[9 - i], HEX); #endif
frequency += (read_buffer[9 - i] >> 4) * decMulti[i * 2]; frequency += (read_buffer[9 - i] & 0x0F) * decMulti[i * 2 + 1]; } #ifdef DEBUG Serial.println(); #endif lcd.setCursor(6, 1); lcd.print(frequency); }
void printMode(void) { //FE FE E0 42 04 <00 01> FD #ifdef DEBUG #endif lcd.setCursor(6, 0); lcd.print(" "); // убрать лишние знаки остается b после usb и тд lcd.setCursor(6, 0); lcd.print(mode[read_buffer[5]]); //read_buffer[6] -> 01 - Wide, 02 - Medium, 03 - Narrow
}
void setup() { lcd.begin(); lcd.setCursor(0, 0); lcd.print("Mode:"); lcd.setCursor(0, 1); lcd.print("Freq:"); Serial.begin(115200); configRadioBaud(9600); radio_address = 0x00;
while(radio_address == 0x00) { if (!searchRadio()) { #ifdef DEBUG Serial.println("Radio not found"); #endif } else { #ifdef DEBUG Serial.print("Radio found at "); Serial.print(radio_address, HEX); Serial.println(); #endif
sendCatRequest(CMD_READ_FREQ); delay(100); sendCatRequest(CMD_READ_MODE); break; } } }
void processCatMessages() { /* <FE FE E0 42 04 00 01 FD - LSB <FE FE E0 42 03 00 00 58 45 01 FD -145.580.000
FE FE - start bytes 00/E0 - target address (broadcast/controller) 42 - source address 00/03 - data type <data> FD - stop byte */
while (CAT.available()) { uint8_t knowncommand = 1; uint8_t r; if (readLine() > 0) { if (read_buffer[0] == START_BYTE && read_buffer[1] == START_BYTE) { if (read_buffer[3] == radio_address) { if (read_buffer[2] == BROADCAST_ADDRESS) { switch (read_buffer[4]) { case CMD_TRANS_FREQ: printFrequency(); break; case CMD_TRANS_MODE: printMode(); break; default: knowncommand = false; } } else if (read_buffer[2] == CONTROLLER_ADDRESS) { switch (read_buffer[4]) { case CMD_READ_FREQ: printFrequency(); break; case CMD_READ_MODE: printMode(); break; default: knowncommand = false; } } } else { #ifdef DEBUG Serial.print(read_buffer[3]); Serial.println(" also on-line?!"); #endif } } }
#ifdef DEBUG //if(!knowncommand){ Serial.print("<"); for (uint8_t i = 0; i < sizeof(read_buffer); i++) { if (read_buffer < 16)Serial.print("0"); Serial.print(read_buffer, HEX); Serial.print(" "); if (read_buffer == STOP_BYTE)break; } Serial.println(); //} #endif } }
void loop() { processCatMessages(); while(Serial.available()){ CAT.write(Serial.read()); } }
Сообщение отредактировал durk-cut - Четверг, 15.06.2017, 12:33 |
|
| |