Перевод платы 27 МГц от HL на 2.4 GHz

Автор Deny, 15:31:25

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

Deny

Доброго дня, друзья!
Хочу Вашему вниманию предложить  один из экономичных путей перевода 27 MHz  на управление  радиоаппаратурой 2.4 GHz. Я понимаю, что сейчас плат управления с  27  МГц практически нет, но все же. Например у меня  завалялось штуки 4 таких плат, выкидывать жалко, а применения не находилось, но вот завязавшись с платами ардуино, получилось дать им вторую жизнь. Скажу сразу скетч, который приведу ниже только на 30 - 40 процентов состоит из моих доработок, все остальное наработки зарубежных коллег, но так как все это распространяется  абсолютно свободно, то ничто не мешает выложить данные тут, для общего пользования.

Использованная плата  - ардуино про мини на 5 в, стоимость на алиэкспресс около 150 рублей.
вот такой вид у данного переходника получается


теперь собственно скетч, для заливки в ардуино

#include <Arduino.h>
#include <avr/wdt.h>


 #define NORMAL  // 5 channels, pins 2,4,5,6,7

#define SERIAL_BAUD_RATE 115200
#define OUT_PIN 11


#define LEDPIN_PINMODE            pinMode (13, OUTPUT);
#define LEDPIN_TOGGLE              PINB |= 1<<5;    //switch LEDPIN state (digital PIN 13)
#define LEDPIN_OFF                PORTB &= ~(1<<5);
#define LEDPIN_ON                  PORTB |= (1<<5);


static uint32_t time = 0;
static uint32_t cycleTime = 0;
extern uint16_t rcValue[];


void setup()
{
  LEDPIN_PINMODE
  LEDPIN_ON
 
  pinMode(OUT_PIN,OUTPUT);    // 11
  TCCR2B = (1<<CS22); 
  TCCR2A =  (1<<WGM21);
  OCR2A = 72; // 124 = 500us
  TIMSK2 |= (1<<OCIE2A);  // enable tim2 interrupt
 
  setupRX();
  setupMotor();
 // SerialOpen(uint32_t baud);
 
  wdt_enable(WDTO_2S);
  cycleTime = millis(); 
}


volatile uint8_t count = 0;


#define OUT_TOGGLE PINB |= 1<<3   
#define OUT_OFF    PORTB &= ~(1<<3)
#define OUT_ON    PORTB |= (1<<3)


uint8_t bitdata[70];
boolean last;


ISR(TIMER2_COMPA_vect)
{
  if      (count <  3) OUT_ON;  // 1ms gap
  else if (count <  4) {OUT_OFF; last = true;}
  else if (count < 66) // 2*4*8 = 64
  {
    if (count & 0x01) OUT_TOGGLE;
    else
    {
      boolean act = bitdata[count>>1];
      if (act == last) OUT_TOGGLE;
      else last = act;
    }
  }
  else { OUT_OFF; return; }
  count++;
};


// timing:
// 24ms cycletime
// 4ms gap
// 1ms pulse
// data in 0.3ms pulses, 2 pulse/bit ca 60 pulse, 4 byte


//          01234567 89012 34567 89012 34 5678 90
// message:  11111100 01111 00000 01111 00 0000 00
// nrz msg:  00000010 01000 10000 01000 10 0000 00
//                    fwd  krldu left  mg cccc
// m-motor, u-up, d-down, l-turleft, r-turright, c-checksum
// g=mg k=fire


extern uint16_t motor[2];
extern uint16_t servo[2];


void loop ()
{
  int8_t i;
  int16_t num;
  boolean m,l,r,g,k,d,u;
  int8_t v1,v2;
  time = millis();
 
  readRX();


  if (time >= cycleTime)
  {
    wdt_reset();
    cycleTime += 23;
    count = 0; // tell driver to restart
   
    for (i=2;i<8;i++) bitdata[i] = 1;


    d = (rcValue[0] > 1700);
    bitdata[18] = d;
    k = (rcValue[5] < 1300);
    bitdata[15] = k; // fire
    g = (rcValue [5]> 1950);
    bitdata[26] = g; // mg fire


    // fwd rev
    v1 = (rcValue[2]-1035)/30; // 1500 -> 15.5
    bitdata[10] = (v1 & 0x10) >> 4;
    bitdata[11] = (v1 & 0x08) >> 3;
    bitdata[12] = (v1 & 0x04) >> 2;
    bitdata[13] = (v1 & 0x02) >> 1;
    bitdata[14] = v1 & 0x01;
   
    // left right
    v2 = (rcValue[1]-1035)/30; // 1500 -> 15.5
    bitdata[20] = (v2 & 0x10) >> 4;
    bitdata[21] = (v2 & 0x08) >> 3;
    bitdata[22] = (v2 & 0x04) >> 2;
    bitdata[23] = (v2 & 0x02) >> 1;
    bitdata[24] = v2 & 0x01;


    l = (rcValue[3] > 1700);
    bitdata[17] = l;
    r = (rcValue[3] < 1300);
    bitdata[16] = r;


    m = (rcValue[4] > 1700);
    bitdata[25] = m; //motor
    u = (rcValue[0] < 1300);
    bitdata[19] = u;


    // checksum
    bitdata[27]  = bitdata[ 9] ^ bitdata[13] ^ bitdata[17] ^ bitdata[21];
    bitdata[28]  = bitdata[10] ^ bitdata[14] ^ bitdata[18] ^ bitdata[22];
    bitdata[29]  = bitdata[11] ^ bitdata[15] ^ bitdata[19] ^ bitdata[23] ^ bitdata[25];
    bitdata[30]  = bitdata[12] ^ bitdata[16] ^ bitdata[20] ^ bitdata[24] ^ bitdata[26];
 int16_t fr,lr,lm,rm;
    fr = rcValue[2] - 1500;
    lr = rcValue[1] - 1500;
    lm = constrain(fr - lr,0,1000);
    rm = constrain(fr + lr,0,1000);
    motor[0] = lm>>2;
    motor[1] = rm>>2;
    writeMotor();
  }
}

#include <wiring.c>


#define RX_BUFFER_SIZE 64
#define TX_BUFFER_SIZE 64
#define INBUF_SIZE 64


static volatile uint8_t serialHeadRX,serialTailRX;
static uint8_t serialBufferRX[RX_BUFFER_SIZE];
static volatile uint8_t serialHeadTX,serialTailTX;
static uint8_t serialBufferTX[TX_BUFFER_SIZE];
static uint8_t serialBuffer[INBUF_SIZE]; // this hold the imcoming string from serial O string
static uint8_t readIndex;


uint16_t read16() {
  uint16_t t = read8();
  t+= (uint16_t)read8()<<8;
  return t;
}
uint8_t read8()  {
  return serialBuffer[readIndex++];
}


void serialize8(uint8_t a)
{
  uint8_t t = serialHeadTX;
  if (++t >= TX_BUFFER_SIZE) t = 0;
  serialBufferTX[t] = a;
  serialHeadTX = t;
}


ISR(USART_UDRE_vect)
{  // Serial 0 on a PROMINI
  uint8_t t = serialTailTX;
  if (serialHeadTX != t) {
    if (++t >= TX_BUFFER_SIZE) t = 0;
    UDR0 = serialBufferTX[t];  // Transmit next byte in the ring
    serialTailTX = t;
  }
  if (t == serialHeadTX) UCSR0B &= ~(1<<UDRIE0); // Check if all data is transmitted . if yes disable transmitter UDRE interrupt
}


void UartSendData()
{
  UCSR0B |= (1<<UDRIE0);
}


static void inline SerialOpen(uint32_t baud)
{
  uint8_t h = ((F_CPU  / 4 / baud -1) / 2) >> 8;
  uint8_t l = ((F_CPU  / 4 / baud -1) / 2);
  UCSR0A  = (1<<U2X0); UBRR0H = h; UBRR0L = l; UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
}


static void inline SerialEnd(uint8_t port)
{
  UCSR0B &= ~((1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<UDRIE0));
}


extern boolean rxFrameFlags;
uint16_t spekTimeLast;  // counts every ms, 65000 ms = 65 sec


static void inline store_uart_in_buf(uint8_t data)
{
  #if defined(SPEK)
    if (!rxFrameFlags)
    {
      sei();
      uint16_t spekTimeNow = timer0_overflow_count;
      uint16_t spekInterval = spekTimeNow - spekTimeLast;                               
      spekTimeLast = spekTimeNow;
      if (spekInterval > 2)
      { 
        serialTailRX = 0;
        serialHeadRX = 0;
        rxFrameFlags = true;
      }
      cli();
    }
  #endif


  uint8_t h = serialHeadRX;
  if (++h >= RX_BUFFER_SIZE) h = 0;
  if (h == serialTailRX) return; // we did not bite our own tail?
  serialBufferRX[serialHeadRX] = data; 
  serialHeadRX = h;
}


ISR(USART_RX_vect)  { store_uart_in_buf(UDR0); }


uint8_t SerialRead()
{
  uint8_t t = serialTailRX;
  uint8_t c = serialBufferRX[t];
  if (serialHeadRX != t) {
    if (++t >= RX_BUFFER_SIZE) t = 0;
    serialTailRX = t;
  }
  return c;
}


uint8_t SerialAvailable()
{
  return ((uint8_t)(serialHeadRX - serialTailRX))%RX_BUFFER_SIZE;
}


void SerialWrite(uint8_t c)
{
  serialize8(c);
  UartSendData();
}


//------------------------------------------------


char digit10000(uint16_t v) {return '0' + v / 10000;}
char digit1000(uint16_t v) {return '0' + v / 1000 - (v/10000) * 10;}
char digit100(uint16_t v) {return '0' + v / 100 - (v/1000) * 10;}
char digit10(uint16_t v) {return '0' + v / 10 - (v/100) * 10;}
char digit1(uint16_t v) {return '0' + v - (v/10) * 10;}


void printChar(const char *s)
{
  while (*s) {serialize8(*s++);}
}


void print_uint8(uint8_t unit)
{
  char line[6] = "  ";
  line[0] = digit100(unit);
  line[1] = digit10(unit);
  line[2] = digit1(unit);
  printChar(line);
}
void print_uint16(uint16_t unit)
{
  char line[6] = "    ";
  line[0] = digit10000(unit);
  line[1] = digit1000(unit);
  line[2] = digit100(unit);
  line[3] = digit10(unit);
  line[4] = digit1(unit);
  printChar(line);
}
void print_int16(int16_t v) {
  uint16_t unit;
  char line[7] = "      ";
  if (v < 0 ) {
    unit = -v;
    line[0] = '-';
  } else {
    unit = v;
    line[0] = ' ';
  }
  line[1] = digit10000(unit);
  line[2] = digit1000(unit);
  line[3] = digit100(unit);
  line[4] = digit10(unit);
  line[5] = digit1(unit);
  printChar(line);
}



uint16_t motor[2];
uint16_t servo[2];


void setupMotor()
{
  // 1000hz, 0..255
  #if !defined(NORMAL)
    pinMode( 6,OUTPUT);   
    pinMode( 5,OUTPUT);   
    TCCR0A |= _BV(COM0A1); // connect pin 6 to timer 0 channel A
    TCCR0A |= _BV(COM0B1); // connect pin 5 to timer 0 channel B
  #endif
 
  pinMode( 9,OUTPUT);   
  pinMode(10,OUTPUT);   
  TCCR1A = (1<<WGM11);
  TCCR1B = (1<<WGM12) | (1<<WGM13);
  TCCR1A |= (1<<COM1A1); // connect pin 9 to timer 1 channel A
  TCCR1A |= (1<<COM1B1); // connect pin 10 to timer 1 channel B
  ICR1 = 0x9F60; // 20ms
  TCCR1B |= (1<<CS11);
 
  // test
  motor[0] = 0;
  motor[1] = 0;
  servo[0] = 1500; // 1,5ms
  servo[1] = 1500;
  writeMotor();
}


void writeMotor()
{
  #if !defined(NORMAL)
    OCR0A = motor[0];  //  Pin6 0..255
    OCR0B = motor[1];  //  Pin5 0..255
  #endif
  OCR1A = servo[0]<<1; //  pin 9  PB5
  OCR1B = servo[1]<<1; //  pin 10  PB6
}



#define RC_CHANS 8
uint16_t rcValue[RC_CHANS];
boolean rxFrameDone;
boolean rxFrameFlags;


#if defined(NORMAL)
  #define PCINT_RX_BITS            (1<<2),(1<<3),(1<<4),(1<<5),(1<<6),(1<<7)

  void setupRX()
  {
    uint8_t i;
    for (i=0;i<RC_CHANS;i++) rcValue[i] = 1500;
   
    // PCINT activation
    // PD2=pcint18, PD4=pcint20, PD5=pcint21, PD6=pcint22, PD7=pcint23
    PORTD  = (1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);
    PCMSK2 = (1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);
       
    PCICR  = (1<<2);
  }

  // port change Interrupt
  ISR(PCINT2_vect)
  { //this ISR is common to every receiver channel, it is call everytime a change state occurs on a RX input pin
    uint8_t mask;
    uint8_t pin;
    uint16_t cTime,dTime;
    static uint16_t edgeTime[6];
    static uint8_t PCintLast;
 
    pin = PIND;
 
    mask = pin ^ PCintLast;  // doing a ^ between the current interruption and the last one indicates wich pin changed
    cTime = micros();        // micros() return a uint32_t, but it is not usefull to keep the whole bits => we keep only 16 bits
    sei();                    // re enable other interrupts at this point, the rest of this interrupt is not so time critical and can be interrupted safely
    PCintLast = pin;          // we memorize the current state of all PINs [D0-D7]
 
    if (mask & (1<<2))
    {                         
      if (pin & (1<<2)) edgeTime [0] = cTime;     
    else rcValue [0] = cTime-edgeTime[0];                                      }
    if (mask & (1<<4))
    {                         
      if (pin & (1<<4)) edgeTime[1] = cTime;
      else rcValue[1] = cTime-edgeTime[1];                                 
    }
    if (mask & (1<<5))
    {                         
      if (pin & (1<<5)) edgeTime[2] = cTime;
      else rcValue[2] = cTime-edgeTime[2];                                 
    }
    if (mask & (1<<6))
    {                         
      if (pin & (1<<6)) edgeTime[3] = cTime;
      else rcValue[3] = cTime-edgeTime[3];                                 
    }
    if (mask & (1<<7))
    {                         
      if (pin & (1<<7)) edgeTime[4] = cTime;
      else rcValue[4] = cTime-edgeTime[4];                                 
    }
    if (mask & (1<<3))
    {                         
      if (pin & (1<<3)) edgeTime[5] = cTime;
      else rcValue[5] = cTime-edgeTime[5];                                 
    }
  }

  void readRX(void) {}
#endif


#if defined(PPMSUM)
  #define IN_PIN 2


  void setupRX()
  {
    uint8_t i;
    for (i=0;i<RC_CHANS;i++) rcValue[i] = 1500;
    pinMode (IN_PIN, INPUT);
    attachInterrupt(0, rxInt, RISING); //PIN 2
  }


  static uint16_t lastrx = 0;
  static uint8_t chan = 0;
   
  void rxInt()
  {
      uint16_t now,diff;
 
      now = micros();
      diff = now - lastrx;
      lastrx = now;
      if(diff>3000) chan = 0;
      else
      {
        if(900<diff && diff<2200 && chan<RC_CHANS ) rcValue[chan] = diff;
        chan++;
        if (chan == 6) rxFrameDone = true;
      }
  }
 
  void readRX(void) {}
#endif


#if defined(SBUS)
  #define SBUS_OFFSET 988
  #define SBUS_SYNCBYTE 0x0F
  static uint8_t sbusIndex=0;
  static uint8_t sbus[25]={0};


  void setupRX()
  {
    uint8_t i;
    for (i=0;i<RC_CHANS;i++) rcValue[i] = 1500;
    SerialOpen(100000);
    UCSR0C |= (1<<UPM01)|(1<<USBS0);
  }


  void readRX(void)
  {
    while(SerialAvailable()){
      int val = SerialRead();
      if(sbusIndex==0 && val != SBUS_SYNCBYTE) continue;
      sbus[sbusIndex++] = val;
      if(sbusIndex==25){
        sbusIndex=0;
        rxFrameFlags = false;
        rcValue[0]  = ((sbus[1]|sbus[2]<< 8) & 0x07FF)/2+SBUS_OFFSET;
        rcValue[1]  = ((sbus[2]>>3|sbus[3]<<5) & 0x07FF)/2+SBUS_OFFSET;
        rcValue[2]  = ((sbus[3]>>6|sbus[4]<<2|sbus[5]<<10) & 0x07FF)/2+SBUS_OFFSET;
        rcValue[3]  = ((sbus[5]>>1|sbus[6]<<7) & 0x07FF)/2+SBUS_OFFSET;
        rcValue[4]  = ((sbus[6]>>4|sbus[7]<<4) & 0x07FF)/2+SBUS_OFFSET;
        rcValue[5]  = ((sbus[7]>>7|sbus[8]<<1|sbus[9]<<9) & 0x07FF)/2+SBUS_OFFSET;
        rcValue[6]  = ((sbus[9]>>2|sbus[10]<<6) & 0x07FF)/2+SBUS_OFFSET;
        rcValue[7]  = ((sbus[10]>>5|sbus[11]<<3) & 0x07FF)/2+SBUS_OFFSET; // & the other 8 + 2 channels if you need them
        rxFrameDone = true;
      }
    }       
  }
#endif


#if defined(SUMD)
  #define SUMD_SYNCBYTE 0xA8
  #define SUMD_MAXCHAN 8
  #define SUMD_BUFFSIZE SUMD_MAXCHAN*2 + 5 // 6 channels + 5 -> 17 bytes for 6 channels
  static uint8_t sumdIndex=0;
  static uint8_t sumdSize=0;
  static uint8_t sumd[SUMD_BUFFSIZE]={0};


  void setupRX()
  {
    uint8_t i;
    for (i=0;i<RC_CHANS;i++) rcValue[i] = 1500;
    SerialOpen(100000);
  }


  void readRX(void)
  {
    while (SerialAvailable())
    {
      int val = SerialRead();
      if(sumdIndex == 0 && val != SUMD_SYNCBYTE) continue;
      if(sumdIndex == 2) sumdSize = val;
      if(sumdIndex < SUMD_BUFFSIZE) sumd[sumdIndex] = val;
      sumdIndex++;
   
      if(sumdIndex == sumdSize*2+5)
      {
        sumdIndex = 0;
        if (sumdSize > SUMD_MAXCHAN) sumdSize = SUMD_MAXCHAN;
        for (uint8_t b = 0; b < sumdSize; b++)
          rcValue[b] = ((sumd[2*b+3]<<8) | sumd[2*b+4])>>3;
        rxFrameDone = true;
      }
    }
  }
#endif


#if defined(SPEK)
  #define SPEK_FRAME_SIZE 16
  #if (SPEK == 1024)
    #define SPEK_CHAN_SHIFT  2      // Assumes 10 bit frames, that is 1024 mode.
    #define SPEK_CHAN_MASK  0x03    // Assumes 10 bit frames, that is 1024 mode.
    #define SPEK_DATA_SHIFT          // Assumes 10 bit frames, that is 1024 mode.
  #endif
  #if (SPEK == 2048)
    #define SPEK_CHAN_SHIFT  3      // Assumes 11 bit frames, that is 2048 mode.
    #define SPEK_CHAN_MASK  0x07    // Assumes 11 bit frames, that is 2048 mode.
    #define SPEK_DATA_SHIFT >> 1    // Assumes 11 bit frames, that is 2048 mode.
  #endif


  void setupRX()
  {
    uint8_t i;
    for (i=0;i<RC_CHANS;i++) rcValue[i] = 1500;
    SerialOpen(115200);
  }


  uint32_t spekLast;
  uint8_t lastavail = 0;


  void readRX()
  {
    if (rxFrameFlags) {  //The interrupt handler saw at least one valid frame start since we were last here.
      if (SerialAvailable() == SPEK_FRAME_SIZE) {  //A complete frame? If not, we'll catch it next time we are called.
        SerialRead(); SerialRead();        //Eat the header bytes
        for (uint8_t b = 2; b < SPEK_FRAME_SIZE; b += 2) {
          uint8_t bh = SerialRead();
          uint8_t bl = SerialRead();
          uint8_t spekChannel = 0x0F & (bh >> SPEK_CHAN_SHIFT);
          if (spekChannel < RC_CHANS) rcValue[spekChannel] = 988 + ((((uint16_t)(bh & SPEK_CHAN_MASK) << 8) + bl) SPEK_DATA_SHIFT);
        }
        rxFrameFlags = false;
        rxFrameDone = true;
      }
    }
  }
#endif


#if defined(IBUS)
  #define IBUS_BUFFSIZE 32
  static uint8_t ibusIndex=0;
  static uint8_t ibus[IBUS_BUFFSIZE]={0};


  void setupRX()
  {
    uint8_t i;
    for (i=0;i<RC_CHANS;i++) rcValue[i] = 1500;
    SerialOpen(100000);
  }


  void readRX(void)
  {
    uint8_t i;
    uint16_t chksum,rxsum;
    uint8_t avail = SerialAvailable();
    while (avail)
    {
      uint8_t val = SerialRead();
      if(ibusIndex == 0 && val != 0x20) { continue; }
      if(ibusIndex == 1 && val != 0x40) { ibusIndex = 0; continue; }
      if(ibusIndex < IBUS_BUFFSIZE) ibus[ibusIndex] = val;
      ibusIndex++;
   
      if(ibusIndex == IBUS_BUFFSIZE)
      {
        ibusIndex = 0;
        chksum = 0xFFFF;
        for (i=0;i<30;i++) chksum -= ibus[i];
        rxsum = ibus[30] + (ibus[31]<<8);
        if (chksum == rxsum)
        {
          rcValue[0] = (ibus[ 3]<<8) + ibus[ 2];
          rcValue[1] = (ibus[ 5]<<8) + ibus[ 4];
          rcValue[2] = (ibus[ 7]<<8) + ibus[ 6];
          rcValue[3] = (ibus[ 9]<<8) + ibus[ 8];
          rcValue[4] = (ibus[11]<<8) + ibus[10];
          rcValue[5] = (ibus[13]<<8) + ibus[12];
          rcValue[6] = (ibus[15]<<8) + ibus[14];
          rcValue[7] = (ibus[17]<<8) + ibus[16];     
          rxFrameDone = true;
        }
      }
    }
  }
#endif


Подключение 5 channels,
pin 2 - RX - 3 CH,
pin 3 - RX - 6 CH - пулемёт
pin 4 - RX - 1 CH,
pin 5 - RX - 2 CH,
pin 6 - RX - 4 CH,
pin 7 - RX - 5 CH -  завод танка

Все работает прекрасно. Может выскочить один  неприятный момент, а именно придвижении вперед вдруг заклинивает систему и ничего нельзя сделать пока не выключишь питание. Это связано с тем, что у каждого приемника свои конечные точки, поэтому иногда происходит перехлест управляющего сигнала. Убирается это очень просто, поставьте на 2- CN  не на 100 % а на 90 %, поверьте при этом ничего не теряется, управление очень плавное.
Будут вопросы пишите!
wcucHufnHqA.jpgwNDUfTrgWbA.jpgWRbQRc3MNPU.jpgy1X75jeDnww.jpg
​Не говорите, если это не изменит тишину к лучшему.

Денис

Спасибо, это интересно.

Zloyuzver

Денис, а к каким пинам подключается провод к блоку управления? ("+", "-", "signal"). Питание берётся от блока управления, а он сколько выдаёт - 5в или больше?

Deny

Руслан, а это для тех кто внимателен)))) в скетче все есть))))  (не обижайтесь))))

#define SERIAL_BAUD_RATE 115200
#define OUT_PIN 11
​Не говорите, если это не изменит тишину к лучшему.

Zloyuzver

Цитата: Deny;5398Руслан, а это для тех кто внимателен)))) в скетче все есть))))  (не обижайтесь))))

#define SERIAL_BAUD_RATE 115200
#define OUT_PIN 11
О, блин, глаз замылился ))) Не обижаюсь ))) Бывает. Спишем всё на "после работы" ;)

Deny

МФУ выдает больше, но это не страшно! завтра выложу  схемку, чтобы было понятно!
​Не говорите, если это не изменит тишину к лучшему.

Deny

Итак, как обещал, схема. Ничего сложного нет!

Снимок.JPG
​Не говорите, если это не изменит тишину к лучшему.

Доктор Верховцев

а вот и готовый комплект

IMG_2061.jpg
"Есть только миг, между прошлым и будущим..."

Сергей Семенов

Не компилится, выскакивает ошибка

Arduino: 1.6.7 (Windows XP), Плата:"Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"


C:\Arduino\_27to2.4\_27to2.4.ino: In function 'void print_uint8(uint8_t)':

_27to2.4:308: error: 'quot' was not declared in this scope

   char line[6] = &quot;   &quot;;

                   ^

C:\Arduino\_27to2.4\_27to2.4.ino: In function 'void print_uint16(uint16_t)':

_27to2.4:316: error: 'quot' was not declared in this scope

   char line[6] = &quot;     &quot;;

                   ^

C:\Arduino\_27to2.4\_27to2.4.ino: In function 'void print_int16(int16_t)':

_27to2.4:326: error: 'quot' was not declared in this scope

   char line[7] = &quot;      &quot;;

                   ^

exit status 1
'quot' was not declared in this scope

Что не так?

Питерский Танковод

Цитата: Сергей СеменовНе компилится, выскакивает ошибка

Arduino: 1.6.7 (Windows XP), Плата:"Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"


Что не так?
Доброго дня. Сергей, попробуйте обновить программу ардуино, у вас версия 1. 6, а сейчас уже версия 1.8 
см. Тут  https://www.arduino.cc/en/Main/Software .  Если не поможет, пишите, будем разбираться. С уважением