Arduino и напряжение

ivan24
Offline
Зарегистрирован: 01.02.2014

Доборый вечер.

Я очень слаб в электричестве, поэтому прошу помощи.

Есть Arduino, есть некое устройство которое подключаю к ней через макетную плату. Этому устроству для питания надо 9в - собственно это питание я ему даю с 9 вольтовой батарейки. Отрицательный полюс этой батарейки я пустил в GND на Arduino. Вопрос - этому заземлению без разницы сколько вольт на этой батарейке - можно ли так делать(с 9в. минус тыкать в gnd arduino) - или я сожгу Arduino?

gregoryl
Offline
Зарегистрирован: 09.09.2013

Без схемы будет очень сложно понять насколько это безопасно.

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

ivan24 пишет:

Доборый вечер.

Я очень слаб в электричестве, поэтому прошу помощи.

Есть Arduino, есть некое устройство которое подключаю к ней через макетную плату. Этому устроству для питания надо 9в - собственно это питание я ему даю с 9 вольтовой батарейки. Отрицательный полюс этой батарейки я пустил в GND на Arduino. Вопрос - этому заземлению без разницы сколько вольт на этой батарейке - можно ли так делать(с 9в. минус тыкать в gnd arduino) - или я сожгу Arduino?

Главное, чтоб плюс не соединяли, а "землю" соединять нужно - ничего страшного не произойдет ;)

ivan24
Offline
Зарегистрирован: 01.02.2014

плюс ардуины вообще никак не касается, только минус с батарейки 9в. веду в gnd на arduino - больше просто некуда. Ну т.е. это точно безопасно для arduino? Переспрашиваю т.к. уж очень боюсь сжечь плату

faraddin
Offline
Зарегистрирован: 11.08.2013

На канале AmperkaRu на ютубе есть отличные переводы обучающих видео по ардуино.. в одном из видео как раз рассматривается Ваш случай с ардуино и батарейкой 9в

StrangerM
Offline
Зарегистрирован: 02.11.2013

Чего вы темните с неким устройством. Если оно питается от 9в, то скорее важно с каким напряжением работают его входы-выходы.  А не подключение его - к - питания ардуино (что верно). А вот если на ВВ 9в, то ардуино вы спалите. 

ivan24
Offline
Зарегистрирован: 01.02.2014

Нет. Про ВВ я знаю. Я согласовал уровни.

Собирал по примеру на оф. сайте арудины

Схема вот эта http://www.arduino.cc/en/Tutorial/ArduinoSoftwareRS232

Только еще к этой схеме я даю 9v с батарейки на 8 пин rs232(так сказано в документации) а минус с этой батарейки веду в gnd arduino. Точнее я вообще вместо 5v с arduino на плюс макетной платы подключаю эти 9v с плюса батарейки. Т.е. на ардуине я использую только tx,rx и gnd - а плюс на макетную плату идет с 9v крона. Вот я хочу понять насколько это безопасно?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ivan24 пишет:

 Точнее я вообще вместо 5v с arduino на плюс макетной платы подключаю эти 9v с плюса батарейки. Т.е. на ардуине я использую только tx,rx и gnd - а плюс на макетную плату идет с 9v крона. Вот я хочу понять насколько это безопасно?

Вы включили 5-вольтовый чип макс232 от 9-вольтовой батарейки?

ivan24
Offline
Зарегистрирован: 01.02.2014

да я уже понял что так нельзя пока писал сюда - переделал))) Теперь просто я даю 9v с батарейки на 8 пин rs232 а минус с этой батарейки веду в gnd arduino. Так можно?

 

Конечный вопрос такой - 9v с батарейки на 8 пин rs232 а минус с этой батарейки в gnd arduino - это мне ничего не сожжет?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ivan24, из ваших слов пока не ясно к чему вы подключаете ардуино, и зачем нужно этому чему-то на 8 ноге питание. В общем случае, если нужно не питать, а дать сигнал высокого уровня, то нужно подключить через резистор.

msg31
Offline
Зарегистрирован: 01.12.2013

Веди минус смело от этой батарейки к ардуино.

Клапауций
Offline
Зарегистрирован: 10.02.2013

msg31 пишет:

Веди минус смело от этой батарейки к ардуино.

у меня в доме сосед батарею отопления заземлил - отвалилась через три года, затопило кипятком три этажа.

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013
ivan24
Offline
Зарегистрирован: 01.02.2014

короче я понял что заземлить можно - но с нужным резистором - правильно?

Подскажите уж тогда на сколько Ом надо резистор, чтобы из 9в. сделать 5?

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

схему нарисуйте, чо вы там соединяете. А то чувствую скоро запахнет паленой ардуиной

ivan24
Offline
Зарегистрирован: 01.02.2014

http://www.arduino.cc/en/Tutorial/ArduinoSoftwareRS232 вот эта схема, точь в точь, только еще в gnd arduino веду минус с 9 вольтовой батарейки, а плюс с батарейки на 8 пин rs232.

В этом и вопрос - а можно ли этот минус с батарейки в ардуину вести?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ivan24, без полного понимания что вы хотите сделать ничего гарантировать нельзя.  Что вы хотите подсоединить к ардуино посредством преобразователя уровня?,  для чего нужно подавать питание от батарейки на разъём?

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

наверно он хочет дуину, питающуюся от батарейки, законектить к ПК. Если так, то

- батареи на gnd дуины,

+ на Vin дуины

gnd и 5В с дуины на соответствующие ноги max232

StrangerM
Offline
Зарегистрирован: 02.11.2013
ivan24
Offline
Зарегистрирован: 01.02.2014

В общем попробую описать все от начала и до конца.

Собрал вот это http://www.arduino.cc/en/Tutorial/ArduinoSoftwareRS232 (Преобразователь уровней max232cpe).

Саму ардуину запитал от usb. С 5v ардуины веду на + макетной платы, с gnd ардуины на - макетной платы.

Значит через rs232 я хочу подключить вкт-7(тепловычислитель). Данные хочу слать в интернет.

Все что я описал прекрасно работает - но, с одним НО, если я втыкаю в свою ардуину ethernet shield - перестает работать.

Далее, в документации ВКТ-7 сказано, что на 8 пин ему нужен постоянный логический 1 не менее 9v. 

Я решил, что раз без шилда работает, а с шилдом - нет - возможно он сжирает нужное электричество.

Собственно эти 9v на 8 пин я и давал с батарейки. Но батарейку тоже надо заземлить. Заземлял я ее в gnd ардуины.

Когда собираю с батарейкой - начинает работать и с ethernet шилдом(т.е. мое предположение верное видимо)

Т.е. схема такая:

  • Arduino RX на ногу max232
  • Arduino TX на ногу max232
  • Arduino GND на пин 5 rs232
  • + от батарейки 9v на 8 пин rs232
  • - от батарейки 9v на Arduino GND

Это работает, но насколько это безопасно?

ivan24
Offline
Зарегистрирован: 01.02.2014

У меня весь процесс из-за этого вопроса стоит на месте. Подскажите

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ivan24, раз работает, значит критических ошибок нет.  Желательно в разрыв между плюсом батарейки и 8 ногой rs232 включить резистор от 200ом до килоома.

ivan24
Offline
Зарегистрирован: 01.02.2014

Ок, большое спасибо

Strom
Offline
Зарегистрирован: 21.11.2016

Доброго времени суток.

Хочу поинтересоваться, получилось ли в итоге подружить ардуино и вкт-7 и поделиться кодом :)

Заранее благодарю.

semy
Offline
Зарегистрирован: 11.02.2017

Strom пишет:

Доброго времени суток.

Хочу поинтересоваться, получилось ли в итоге подружить ардуино и вкт-7 и поделиться кодом :)

Заранее благодарю.

еще актуально?

Strom
Offline
Зарегистрирован: 21.11.2016

semy пишет:

Strom пишет:

Доброго времени суток.

Хочу поинтересоваться, получилось ли в итоге подружить ардуино и вкт-7 и поделиться кодом :)

Заранее благодарю.

еще актуально?


Да!

semy
Offline
Зарегистрирован: 11.02.2017

использовал этот моуль, но думаю без него тоже будет работать, модуль больше в качестве развязки, вычиситель прекрасно понимает уровень 5В.

https://ru.aliexpress.com/item/RS232-to-TTL-Converter-Board-Serial-Module-3-3V-5-5V-MAX3232-for-Arduino-Pack-of/32740137830.html?spm=2114.03010208.3.376.xfv4q8&ws_ab_test=searchweb0_0,searchweb201602_5_10065_10068_10136_10137_10138_10060_10062_10141_10056_10055_10054_10059_10099_10103_10102_10096_10148_120_10052_10053_10050_10107_10142_10051_10143_10084_10117_10083_10119_10080_10082_10081_10110_10111_10112_10113_10114_10037_10033_10032_10078_10079_10077_10073_10070_10123_10120_10127_10124_10125,searchweb201603_2,afswitch_1_afChannel,ppcSwitch_5,single_sort_0_default&btsid=b4298fe6-bbfc-43a1-8db6-d1293d8d6135&algo_expid=b617f201-06ef-48d3-aef4-5e60657b28e7-43&algo_pvid=b617f201-06ef-48d3-aef4-5e60657b28e7

на модуле с обратной стороны к 8 пину припаял перемычку от питания. Вожусь с протоколом. Пока научился читать текущие параметры и некоторые итоговые, уж больно избыточный протокол обмена.

код для меги, еще сосвсем сырой, выдает T1, T2, V1, M1 (испытан на столе)

unsigned long previousMillisTemp = 0;
unsigned long intervalTemp = 10000; // Интервал опроса
unsigned long currentMillis;
byte buf[270];
int k;
int rs;

#define DEBUG 0

byte cmd1[] = {0xFF, 0xFF, 0x00, 0x10, 0x3F, 0xFF, 0x00, 0x00, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x64, 0x54}; //Начало сеанса связи
// ответ 00 10 3F FF 00 00 FD FC



byte cmd2[] = {0xFF, 0xFF, 0x00, 0x03, 0x3F, 0xFE, 0x00, 0x00, 0x29, 0xFF}; //Чтение данных
//               FF      FF 00 03 3F FE 00 00 29 FF

byte cmd3[] = {0xFF, 0xFF, 0x00, 0x03, 0x3F, 0xF9, 0x00, 0x00, 0x98, 0x3E}; // свойства
byte cmd31[] = {0xFF, 0xFF, 0x00, 0x03, 0x3F, 0xFC, 0x00, 0x00, 0x88, 0x3F}; // Запрос на чтение перечня активных элементов данных


byte cmd4[] = {0xFF, 0xFF, 0x00, 0x10, 0x3F, 0xFF, 0x00, 0x00, 0x60, 0x2C, 0x00, 0x00, 0x40, 0x07,
               0x00, 0x2D, 0x00, 0x00, 0x40, 0x07, 0x00, 0x2E, 0x00, 0x00, 0x40, 0x07, 0x00, 0x2F,
               0x00, 0x00, 0x40, 0x07, 0x00, 0x30, 0x00, 0x00, 0x40, 0x07, 0x00, 0x35, 0x00, 0x00,
               0x40, 0x07, 0x00, 0x37, 0x00, 0x00, 0x40, 0x07, 0x00, 0x38, 0x00, 0x00, 0x40, 0x07,
               0x00, 0x39, 0x00, 0x00, 0x40, 0x01, 0x00, 0x3B, 0x00, 0x00, 0x40, 0x01, 0x00, 0x3C,
               0x00, 0x00, 0x40, 0x01, 0x00, 0x3D, 0x00, 0x00, 0x40, 0x01, 0x00, 0x42, 0x00, 0x00,
               0x40, 0x01, 0x00, 0x46, 0x00, 0x00, 0x40, 0x01, 0x00, 0x45, 0x00, 0x00, 0x40, 0x01,
               0x00, 0x4C, 0x00, 0x00, 0x40, 0x01, 0x00, 0x8C, 0x75
              };
//71 текущие
byte cmd5[] = { 0xFF, 0xFF, 0x00, 0x10, 0x3F, 0xFF, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x01,
                0x00, 0x00, 0x40, 0x02, 0x00, 0x09, 0x00, 0x00, 0x40, 0x02, 0x00, 0x0A, 0x00, 0x00, 0x40, 0x02,
                0x00, 0x0C, 0x00, 0x00, 0x40, 0x04, 0x00, 0x0E, 0x00, 0x00, 0x40, 0x02, 0x00, 0x11, 0x00, 0x00,
                0x40, 0x04, 0x00, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x13, 0x00, 0x00, 0x40, 0x04, 0x00, 0x4D,
                0x00, 0x00, 0x40, 0x01, 0x00, 0xA7, 0x8C
              };

byte cmd51[] = { 0xFF, 0xFF, 0x00, 0x10, 0x3F, 0xFD, 0x00, 0x00, 0x02, 0x04, 0x00, 0x72, 0x12};



//65 итоговые
byte cmd6[] = {0xFF, 0xFF, 0x00, 0x10, 0x3F, 0xFF, 0x00, 0x00, 0x36, 0x03, 0x00, 0x00, 0x40, 0x04, 0x00, 0x06,
               0x00, 0x00, 0x40, 0x04, 0x00, 0x07, 0x00, 0x00, 0x40, 0x04, 0x00, 0x0C, 0x00, 0x00, 0x40, 0x04,
               0x00, 0x0E, 0x00, 0x00, 0x40, 0x02, 0x00, 0x11, 0x00, 0x00, 0x40, 0x04, 0x00, 0x12, 0x00, 0x00,
               0x40, 0x04, 0x00, 0x13, 0x00, 0x00, 0x40, 0x04, 0x00, 0x4D, 0x00, 0x00, 0x40, 0x01, 0x00, 0x73,
               0x86
              };

byte cmd61[] = { 0xFF, 0xFF, 0x00, 0x10, 0x3F, 0xFD, 0x00, 0x00, 0x02, 0x05, 0x00, 0x73, 0x82};


void setup() {

  Serial.begin(9600);
  Serial3.begin(9600, SERIAL_8N2); // к вычислителю
  //Serial3.begin(9600); // тоже работает
  Serial.println("start");
  delay(500);

  rs = sendCmd(cmd1, sizeof(cmd1), buf, sizeof(buf));

  // подобрать паузы
  delay(1000);

  rs = sendCmd(cmd2, sizeof(cmd2), buf, sizeof(buf));
  //for (int i = 0; i < rs; i++) Serial.print(buf[i], HEX);
  //Serial.println();
  delay(100);

  rs = sendCmd(cmd3, sizeof(cmd3), buf, sizeof(buf));
  //  delay(100);
  //for (int i = 0; i < rs; i++) Serial.print(buf[i], HEX);
  //Serial.println();

  delay(300);

  rs = sendCmd(cmd4, sizeof(cmd4), buf, sizeof(buf));
  //  delay(100);
  //for (int i = 0; i < rs; i++) Serial.print(buf[i], HEX);
  //Serial.println();
  delay(300);

  rs = sendCmd(cmd31, sizeof(cmd31), buf, sizeof(buf));
  delay(300);

  rs = sendCmd(cmd5, sizeof(cmd5), buf, sizeof(buf));
  //
  //for (int i = 0; i < rs; i++) Serial.print(buf[i], HEX);
  //Serial.println();

  delay(300);

  rs = sendCmd(cmd51, sizeof(cmd51), buf, sizeof(buf));

  //  delay(300);
  Serial.println("Tekushchie:");
  delay(100);
  rs = sendCmd(cmd2, sizeof(cmd2), buf, sizeof(buf));
  // for (int i = 3; i < buf[2]; i++) {
  //  Serial.print(buf[i]);
  //  Serial.print(';');
  // }
  int t;
  t |= (int)buf[4] << 8;
  t |= (int)buf[3] ;
  //  for (int i = 0; i < rs; i++) Serial.print(buf[i], HEX);
  Serial.print("t1="); Serial.println(t / 100.0);
  t = 0;
  t |= (int)buf[8] << 8;
  t |= (int)buf[7] ;
  Serial.print("t2="); Serial.println(t / 100.0);
  Serial.println();
  delay(300);

  Serial.println("Itog:");

  //rs = sendCmd(cmd31, sizeof(cmd31), buf, sizeof(buf));
  //delay(300);

  rs = sendCmd(cmd6, sizeof(cmd6), buf, sizeof(buf));

  delay(300);

  rs = sendCmd(cmd61, sizeof(cmd61), buf, sizeof(buf));
  delay(100);
  rs = sendCmd(cmd2, sizeof(cmd2), buf, sizeof(buf));
  long v = 0;
  v |= (long)buf[6] << 24;
  v |= (long)buf[5] << 16;
  v |= (long)buf[4] << 8;
  v |= (long)buf[3] ;
  //  for (int i = 0; i < rs; i++) Serial.print(buf[i], HEX);
  Serial.print("V1="); Serial.println(v / 100.0);
  v = 0;
  v |= (long)buf[12] << 24;
  v |= (long)buf[11] << 16;
  v |= (long)buf[10] << 8;
  v |= (long)buf[9] ;
  //  for (int i = 0; i < rs; i++) Serial.print(buf[i], HEX);
  Serial.print("M1="); Serial.println(v / 100.0);
  Serial.println();
  //  for (int i = 0; i < rs; i++) Serial.print(buf[i], HEX);

}

void loop() {
  currentMillis = millis()+intervalTemp; ;

  if (currentMillis - previousMillisTemp > intervalTemp) {
      previousMillisTemp = currentMillis;
// здесь будем опрашивать счетчик
  }

}

int sendCmd(byte * cmd, int s, byte * response, int rs) {
  if (DEBUG)  Serial.print("send: ");
  int n = 0;
  byte byteReceived;
  for (int i = 0; i < s; i++) {
    Serial3.write(cmd[i]);
    if (DEBUG)  {
      Serial.print(cmd[i], HEX);
      Serial.print(";");
    }
    //delay(2);
  }
  delay(200);
  if (DEBUG)  {
    Serial.println();
    Serial.print("get: ");
  }
  for (int i = 0; i < rs; i++) response[i] = 0;
  while (Serial3.available()) {
    byteReceived  = Serial3.read();
    response[n++] = byteReceived;
    if (DEBUG)  {
      Serial.print(byteReceived, HEX);
      Serial.print(";");
    }
    delay(1);
  }
  delay(5);
  if (DEBUG)  {
    Serial.println();
  }
  //Serial.print("count: "); Serial.println(n);
  if (n > rs) n = rs;

  if (n > 2) {
    word CheckSumm = Crc16(response, n - 2);

    if ((response[n - 2] != (byte)CheckSumm) ||  (response[n - 1] != CheckSumm >> 8)) {
      Serial.println("crc erorr");
      n = 0;
      //Serial.print((byte)CheckSumm, HEX); Serial.print("!="); Serial.println(response[n - 2], HEX);
      //Serial.print(CheckSumm >> 8, HEX); Serial.print("!="); Serial.println(response[n - 1], HEX);
    } else if (DEBUG)  {
      Serial.println("crcOK");
    }
  } else n = 0;
  return n;
}

word Crc16(byte *Data, unsigned long s)
{
  byte *ptrByte;
  word w;
  ptrByte = Data;
  w = 0xFFFFU;
  for (int byte_cnt = 0; byte_cnt < s; byte_cnt++)
  {
    w = (word)((w / 256U) * 256U + ((w % 256U) ^ (Data[byte_cnt])));
    for (int shift_cnt = 0; shift_cnt < 8; shift_cnt++)
    { /*обработка байта*/
      if ((w & 0x1) == 1)
        w = (word)((w >> 1) ^ 0xA001U);
      else
        w >>= 1;
    }
  }
  return w;
}

Если инересно, ВТЭ еще проще подключается и намного проще обмен, никаких опторазвязок не нужно.

 

semy
Offline
Зарегистрирован: 11.02.2017

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

Strom
Offline
Зарегистрирован: 21.11.2016

Спасибо огромное! На днях пойду ковырять