Страница 2 из 5

Re: Arduino

Добавлено: 01 июн 2017, 11:16
Olej
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 секунд.

Re: Arduino

Добавлено: 01 июн 2017, 11:55
Olej
А вот куда интереснее пример (я его где-то списал ... не помню, а потом несколько поэкспериментировал)...
Измеритель номинала ёмкости радиотехнических конденсаторов:
- цифровой вывод 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

Re: Arduino

Добавлено: 01 июн 2017, 12:07
Olej
И ещё такая развлекуха: регулирование потенциометром (напряжением с ползунка) яркости свечения (напряжения запитывания) светодиода:

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

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-системой над промышленным проектом АСУТП...

Re: Arduino

Добавлено: 01 июн 2017, 16:25
Olej
Ещё одно развлечение - на использование функций, как библиотечных, так и собственных...
Управление яркостью 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() ведут себя как обычные аналоговые выходы.

Re: Arduino

Добавлено: 01 июн 2017, 18:56
Olej
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.
Как я понимаю, где-то с этой ссылкой рядом вы найдёте такое же описание для модели, которая наиболее похожа на ту, которая у вас в руках.

Re: Arduino

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

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

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

Re: Arduino

Добавлено: 01 июн 2017, 21:33
Olej
Двунаправленный обмен 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.

Re: Arduino

Добавлено: 02 июн 2017, 12:40
Olej
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

Re: Arduino

Добавлено: 02 июн 2017, 12:45
Olej
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
...

Re: Arduino

Добавлено: 02 июн 2017, 13:33
Olej
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, без её запуска...