ic-v cat интерфейс Icom IC-732-736 требуется помощь - ФОРУМ ДВ Робот dvrobot.ru
Среда, 26.07.2017, 08:37
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    Страница 1 из 11
    Модератор форума: Serg, GRACH 
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » ic-v cat интерфейс Icom IC-732-736 требуется помощь
    ic-v cat интерфейс Icom IC-732-736 требуется помощь
    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()); 
    }
    }
    Прикрепления: 2183411.jpg(81Kb)


    Сообщение отредактировал durk-cut - Четверг, 15.06.2017, 12:33
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » ic-v cat интерфейс Icom IC-732-736 требуется помощь
    Страница 1 из 11
    Поиск:

    ДВ Робот - Чат