Arduino

встраиваемые модели

Модераторы: Olej, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 01 июн 2017, 11:16

Olej писал(а): Это всё очень сильно напоминает PLC (программируемые логические контроллеры) для управления технологическими процессами ... только на пЫонЭрском ;-) уровне младших классов средней школы.
Программа перемиргивания 2-х светодиодов выглядит так:

Код: Выделить всё

int led1 = 8;
int led2 = 7;

void setup() {
   pinMode(led1, OUTPUT);
   pinMode(led2, OUTPUT); 
}

void loop() {
   digitalWrite(led1, HIGH);
   delay(300);
   digitalWrite(led2, HIGH);
   delay(750);
   digitalWrite(led1, LOW);
   delay(500);
   digitalWrite(led2, LOW);
   delay(1500);
}
Если функцией pinMode вывод сконфигурирован как выход (OUTPUT) и функцией digitalWrite на него подан высокий уровень HIGH, то на выводе установится напряжение 5В. В этом режиме он может быть источником тока и, например, засвечивать светодиод, последовательно подключенный через резистор к земле либо к другому выходу с уровнем LOW.
a2.png
На монтажной панели Arduino просто коммутируем проводами выводы D7 и D8 на воткнутые GND светодиоды:
2017-06-01-105947.jpg
Рассмотреть это сложно - удёт засветка WEB-камеры светодиодами ... да и выглядит это "в натуре" ужасно - сплетение проводов ... но, единственный плюс, коммутируется это в 30 секунд.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 01 июн 2017, 11:55

А вот куда интереснее пример (я его где-то списал ... не помню, а потом несколько поэкспериментировал)...
Измеритель номинала ёмкости радиотехнических конденсаторов:
- цифровой вывод D13, через достаточно большой (номинал resistorValue) зарядный резистор, подключается на измеряемый конденсатор;
- цифровой вывод D11, через небольшой (номинал не имеет значения) разрядный резистор, подключается на измеряемый конденсатор;
- аналоговый вывод A0 подключается непосредственно к измеряемому конденсатору, в режиме измерения напряжения;
- измеряется время, в течении которого напряжений на конденсаторе достигнет 63.2% от полного питающего напряжения;
- по постоянной времени RC-цепочки вычисляется ёмкость конденсатора;
- результат выводится через эмулятор сериального порта (через USB-подключение) на инструментальный компьютер и далее в программу IDE Arduino;

Код: Выделить всё

/*  RCTiming_capacitance_meter
 *   Paul Badger 2008
 *  Demonstrates use of RC time constants to measure the value of a capacitor 
 *
 * Theory   A capcitor will charge, through a resistor, in one time constant, defined as T seconds where
 *    TC = R * C
 * 
 *    TC = time constant period in seconds
 *    R = resistance in ohms
 *    C = capacitance in farads (1 microfarad (ufd) = .0000001 farad = 10^-6 farads ) 
 *
 *    The capacitor's voltage at one time constant is defined as 63.2% of the charging voltage.
 *
 *  Hardware setup:
 *  Test Capacitor between common point and ground (positive side of an electrolytic capacitor  to common)
 *  Test Resistor between chargePin and common point
 *  220 ohm resistor between dischargePin and common point
 *  Wire between common point and analogPin (A/D input)
 */

#define analogPin      0                    // analog pin for measuring capacitor voltage
#define chargePin      13                   // pin to charge the capacitor - connected to one end of the charging resistor
#define dischargePin   11                   // pin to discharge the capacitor
#define resistorValue  10000.0F             // change this to whatever resistor value you are using
                                            // F formatter tells compliler it's a floating point value

unsigned long startTime;
unsigned long elapsedTime;
float microFarads;                          // floating point variable to preserve precision, make calculations
float nanoFarads;

void setup(){
  pinMode(chargePin, OUTPUT);               // set chargePin to output
  digitalWrite(chargePin, LOW);  
  Serial.begin(9600);                       // initialize serial transmission for debugging
}

void loop(){
  digitalWrite(chargePin, HIGH);            // set chargePin HIGH and capacitor charging
  startTime = millis();

  while(analogRead(analogPin) < 648){       // 647 is 63.2% of 1023, which corresponds to full-scale voltage 
  }

  elapsedTime = millis() - startTime;
 // convert milliseconds to seconds ( 10^-3 ) and Farads to microFarads ( 10^6 ),  net 10^3 (1000)  
  microFarads = ((float)elapsedTime / resistorValue) * 1000;   
  Serial.print(elapsedTime);                // print the value to serial port
  Serial.print(" mS    ");                  // print units and carriage return

  if (microFarads > 1) {
    Serial.print((long)microFarads);       // print the value to serial port
    Serial.println(" microFarads");         // print units and carriage return
  }
  else
  {
    // if value is smaller than one microFarad, convert to nanoFarads (10^-9 Farad). 
    // This is  a workaround because Serial.print will not print floats
    nanoFarads = microFarads * 1000.0;      // multiply by 1000 to convert to nanoFarads (10^-9 Farads)
    Serial.print((long)nanoFarads);         // print the value to serial port
    Serial.println(" nanoFarads");          // print units and carriage return
  }

  /* dicharge the capacitor  */
  digitalWrite(chargePin, LOW);             // set charge pin to  LOW 
  pinMode(dischargePin, OUTPUT);            // set discharge pin to output 
  digitalWrite(dischargePin, LOW);          // set discharge pin LOW 
  while(analogRead(analogPin) > 0){         // wait until capacitor is completely discharged
  }

  pinMode(dischargePin, INPUT);            // set discharge pin back to input
}
Там есть достаточно оригинальный трюк: разрядный вывод D11, после разряда конденсатора, переводится из OUTPUT режима в "якобы" INPUT (хотя по нему ничего не вводится), чтобы вывод перешёл в высоко импедансное состояние и не влиял на последующий заряд.
Компилируем, закачиваем в Arduino, и жмём (в верхнем правом углу IDE) "монитор последовательного порта":
a3.png
Номинал указанный на конденсаторе (электролит) - 480 uF
Вложения
Kondensator.ino
(3.29 КБ) 122 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 01 июн 2017, 12:07

И ещё такая развлекуха: регулирование потенциометром (напряжением с ползунка) яркости свечения (напряжения запитывания) светодиода:

Код: Выделить всё

int ledPin = 10;                     // светодиод подключен к цифровому выводу D10
int analogPin = 3;                   // ползунок потенциометра подключен к аналоговому выводу A3
 
void setup() {
  pinMode(ledPin, OUTPUT);           // переключение вывода в режим «выход»
}
 
void loop() {
  int val = analogRead(analogPin);   // считываем входное напряжение
  analogWrite(ledPin, val / 4);      /* значения, возвращаемые analogRead лежат в пределах от 0 до 1023, 
                                        а задаваемый коэффициент analogWrite – от 0 to 255*/
}
В принципе, всё это сильно-сильно напоминает работу с программируемыми логическими контроллерами, PLC ... Siemens & Schnider Electric - с последними приходилось как-то работать с их SCADA-системой над промышленным проектом АСУТП...
Вложения
Potenciom.ino
(765 байт) 119 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 01 июн 2017, 16:25

Ещё одно развлечение - на использование функций, как библиотечных, так и собственных...
Управление яркостью 2-х светодиодов "в квадратуре" (sin/cos):

Код: Выделить всё

int led1 = 6, led2 = 10;    // могут быть 3, 5, 6, 9, 10 и 11
unsigned long step = 0;
const double pi = 3.1415926;

void setup() {
   pinMode( led1, OUTPUT );
   pinMode( led2, OUTPUT );
   Serial.begin( 57600 );
}

void debug( double vsin, double vcos ) {
   Serial.print( step );
   Serial.print( " : " );
   Serial.print( vsin );
   Serial.print( " | " );
   Serial.println( vcos );
}

void loop() {
   const long ampl = 127;
   step++;
   double arg = 2. * pi * (double)step / 100.,
          vsin = sin( arg ) * ampl,
          vcos = cos( arg ) * ampl;
   analogWrite( led1, (long)vsin + ampl );
   analogWrite( led2, (long)vcos + ampl );
   if( 0 == step % 50 )
      debug( vsin, vcos );
   delay( 40 );
}
И тут выплывает ещё одна "засада" Arduino:
- не все цифровые Di и аналоговые Ai выводы имею одинаковую функциональность...
- хуже того, что разные модели Arduino (или с одним названием но разных производителей) имеют разную функциональность выводов;
- а ещё хуже то, что отечественные продавцы не знают и не указывают точно ни модель, ни производителя...
- и выяснять функциональность выводов (и что там есть и чего нет) вам придётся, скорее всего, опытным путём! :cry:
analogWrite()
Описание

Формирует заданное аналоговое напряжение на выводе в виде ШИМ-сигнала. Может использоваться для варьирования яркости свечения светодиода или управления скоростью вращения двигателя. После вызова analogWrite(), на выводе будет непрерывно генерироваться ШИМ-сигнал с заданным коэффициентом заполнения до следующего вызова функции analogWrite() (либо до момента вызова digitalRead() или digitalWrite(), взаимодействующих с этим же выводом). Частота ШИМ составляет приблизительно 490 Гц.

На большинстве плат Arduino (на базе микроконтроллеров ATmega168 или ATmega328) функция analogWrite() работает с выводами 3, 5, 6, 9, 10 и 11. На Arduino Mega функция работает с выводами со 2 по 13. На более старых версиях Arduino (на базе микроконтроллера ATmega8) функция analogWrite() работает только с выводами 9, 10 и 11.

Arduino Due поддерживает функцию analogWrite() для выводов со 2 по 13, а также для выводов DAC0 и DAC1. В отличие от ШИМ-выводов, DAC0 и DAC1 являются выводам цифро-аналоговых преобразователей, поэтому при вызове analogWrite() ведут себя как обычные аналоговые выходы.
Вложения
a5.png
a4.png

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 01 июн 2017, 18:56

Olej писал(а): И тут выплывает ещё одна "засада" Arduino:
- не все цифровые Di и аналоговые Ai выводы имею одинаковую функциональность...
- хуже того, что разные модели Arduino (или с одним названием но разных производителей) имеют разную функциональность выводов;
- а ещё хуже то, что отечественные продавцы не знают и не указывают точно ни модель, ни производителя...
- и выяснять функциональность выводов (и что там есть и чего нет) вам придётся, скорее всего, опытным путём! :cry:
По этому поводу вам придётся искать описание своего конкретно изделия!
Вот, например, по поводу того Arduino Nano, который почти похож на тот, что попал мне в руки:
...
Входы и выходы

С использованием функций pinMode(), digitalWrite() и digitalRead() каждый из 14 цифровых выводов Arduino Nano может работать в качестве входа или выхода. Рабочее напряжение выводов - 5В. Максимальный ток, который может отдавать или потреблять один вывод, составляет 40 мА. Все выводы сопряжены с внутренними подтягивающими резисторами (по умолчанию отключенными) номиналом 20-50 кОм. Помимо основных, некоторые выводы Ардуино могут выполнять дополнительные функции:

Последовательный интерфейс: выводы 0 (RX) и 1 (TX). Используются для получения (RX) и передачи (TX) данных по последовательному интерфейсу. Эти выводы соединены с соответствующими выводами микросхемы-преобразователя USB-UART от FTDI.
Внешние прерывания: выводы 2 и 3. Данные выводы могут быть сконфигурированы в качестве источников прерываний, возникающих при различных условиях: при низком уровне сигнала, по фронту, по спаду или при изменении сигнала. Для получения дополнительной информации см. функцию attachInterrupt().
ШИМ: выводы 3, 5, 6, 9, 10 и 11. С помощью функции analogWrite() могут выводить 8-битные аналоговые значения в виде ШИМ-сигнала.
Интерфейс SPI: выводы 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Данные выводы позволяют осуществлять связь по интерфейсу SPI. В устройстве реализована аппаратная поддержка SPI, однако на данный момент язык Ардуино пока ее не поддерживает.
Светодиод: вывод 13. Встроенный светодиод, подсоединенный к цифровому выводу 13. При отправке значения HIGH светодиод включается, при отправке LOW - выключается.
В Arduino Ethernet есть 8 аналоговых входов, каждый из которых может представить аналоговое напряжение в виде 10-битного числа (1024 различных значения). По умолчанию, измерение напряжения осуществляется относительно диапазона от 0 до 5 В. Тем не менее, верхнюю границу этого диапазона можно изменить, используя вывод AREF и функцию analogReference(). Помимо этого, некоторые из выводов имеют дополнительные функции:

I2С: выводы 4 (SDA) и 5 (SCL). С использованием библиотеки Wire (документация на веб-сайте Wiring) данные выводы могут осуществлять связь по интерфейсу I2C (TWI).
Помимо перечисленных на плате существует еще несколько выводов:

AREF. Опорное напряжение для аналоговых входов. Может задействоваться функцией analogReference().
Reset. Формирование низкого уровня (LOW) на этом выводе приведет к перезагрузке микроконтроллера. Обычно этот вывод служит для функционирования кнопки сброса на платах расширения
Смотрите также соответствие выводов Arduino и ATmega168.
Как я понимаю, где-то с этой ссылкой рядом вы найдёте такое же описание для модели, которая наиболее похожа на ту, которая у вас в руках.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 01 июн 2017, 19:29

Olej писал(а): Компилируем, закачиваем в Arduino, и жмём (в верхнем правом углу IDE) "монитор последовательного порта":
Вот это устройство (интерфейс) в Linux:

Код: Выделить всё

[olej@dell SinCos]$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 июн  1 19:26 /dev/ttyUSB0

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 01 июн 2017, 21:33

Двунаправленный обмен Linux <-> Arduino:

Код: Выделить всё

void setup() {
   Serial.begin( 9600 );
}
 
void loop() {
   if( Serial.available() > 0 ) {       // отвечаем на данные только после их получения
      int incomingByte = Serial.read(); // считываем принятый байт:
      Serial.print( "Принято: ");       // сообщаем, что именно мы получили
      Serial.println( incomingByte, HEX );      
   }
   delay( 2 );
}
Мне важно было здесь (в отличие от 99.99% пользователей, живущих в Arduino под Windows) то, как моделируемый канал Linux <-> Arduino отреагирует (в ту и в другую сторону) на текст Unicode в кодировке UTF-8.
Вложения
a14.png
a10.png
a10.png (15.77 КБ) 3073 просмотра
a11.png
a11.png (19.83 КБ) 3073 просмотра
a12.png
a12.png (15.61 КБ) 3073 просмотра
a13.png
a13.png (22.7 КБ) 3073 просмотра
InOut.ino
(456 байт) 117 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 02 июн 2017, 12:40

Olej писал(а): Вот это устройство (интерфейс) в Linux:

Код: Выделить всё

[olej@dell SinCos]$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 июн  1 19:26 /dev/ttyUSB0

Код: Выделить всё

[olej@dell include]$ lsusb | grep -i serial
Bus 002 Device 012: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Поддерживается вот этим модулем ядра Linux:

Код: Выделить всё

[olej@dell Arduino]$ modprobe -c | grep -i 1a86 | grep -i 7523 
alias usb:v1A86p7523d*dc*dsc*dp*ic*isc*ip*in* ch341

[olej@dell Arduino]$ lsmod | grep ch341
ch341                  16384  0

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 02 июн 2017, 12:45

Olej писал(а):Но оно и понятно - устанавливается GCC и вся среда разработки для AVR процессоров.
Установлено вот сюда:

Код: Выделить всё

[root@dell avr]# pwd
/usr/avr

[root@dell avr]# ls -l bin
итого 8896
-rwxr-xr-x 2 root root  751112 ноя 13  2016 ar
-rwxr-xr-x 2 root root  991856 ноя 13  2016 as
-rwxr-xr-x 4 root root 1231544 ноя 13  2016 ld
-rwxr-xr-x 4 root root 1231544 ноя 13  2016 ld.bfd
-rwxr-xr-x 2 root root  735048 ноя 13  2016 nm
-rwxr-xr-x 2 root root  912496 ноя 13  2016 objcopy
-rwxr-xr-x 2 root root 1058488 ноя 13  2016 objdump
-rwxr-xr-x 2 root root  751160 ноя 13  2016 ranlib
-rwxr-xr-x 2 root root  513960 ноя 13  2016 readelf
-rwxr-xr-x 2 root root  912472 ноя 13  2016 strip
Детальные настройки среду (кроме, некоторые, GUI визуально в "Настройки" IDE см. картинку) в $HOME/.arduino15/preferences.txt :

Код: Выделить всё

...
serial.databits=8
serial.debug_rate=57600
serial.line_ending=0
serial.parity=N
serial.port=/dev/ttyUSB0
serial.port.file=ttyUSB0
serial.stopbits=1
...
Вложения
a1.png

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Arduino

Непрочитанное сообщение Olej » 02 июн 2017, 13:33

Olej писал(а):
Olej писал(а):

Код: Выделить всё

[olej@dell include]$ lsusb | grep -i serial
Bus 002 Device 012: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Поддерживается вот этим модулем ядра Linux:

Код: Выделить всё

[olej@dell Arduino]$ modprobe -c | grep -i 1a86 | grep -i 7523 
alias usb:v1A86p7523d*dc*dsc*dp*ic*isc*ip*in* ch341

[olej@dell Arduino]$ lsmod | grep ch341
ch341                  16384  0
При подключении (к USB) устройства выполняется конфигурирование такими вот уведомлениями подсистемы UDEV:

Код: Выделить всё

[olej@dell .arduino15]$ udevadm monitor --property --kernel
monitor will print the received events for:
KERNEL - the kernel uevent

KERNEL[79242.900834] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3 (usb)
ACTION=add
BUSNUM=002
DEVNAME=/dev/bus/usb/002/014
DEVNUM=014
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3
DEVTYPE=usb_device
MAJOR=189
MINOR=141
PRODUCT=1a86/7523/254
SEQNUM=3230
SUBSYSTEM=usb
TYPE=255/0/0

KERNEL[79242.901163] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0 (usb)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0
DEVTYPE=usb_interface
INTERFACE=255/1/2
MODALIAS=usb:v1A86p7523d0254dcFFdsc00dp00icFFisc01ip02in00
PRODUCT=1a86/7523/254
SEQNUM=3231
SUBSYSTEM=usb
TYPE=255/0/0

KERNEL[79242.901315] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/ttyUSB0 (usb-serial)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/ttyUSB0
SEQNUM=3232
SUBSYSTEM=usb-serial

KERNEL[79242.903307] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/ttyUSB0/tty/ttyUSB0 (tty)
ACTION=add
DEVNAME=/dev/ttyUSB0
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/ttyUSB0/tty/ttyUSB0
MAJOR=188
MINOR=0
SEQNUM=3233
SUBSYSTEM=tty
Интересовало бы как организовать обмен вот с этим /dev/ttyUSB0 помимо среды IDE, без её запуска...

Ответить

Вернуться в «Одноплатные компьютеры»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя