Rating@Mail.ru

Форум по операционной системе GNU/Linux и свободному программному обеспечению


Текущее время: 21 май 2018, 06:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: Arduino
Непрочитанное сообщениеДобавлено: 01 июн 2017, 11:16 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
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
a2.png [ 53.29 КБ | Просмотров: 788 ]

На монтажной панели Arduino просто коммутируем проводами выводы D7 и D8 на воткнутые GND светодиоды:
Вложение:
2017-06-01-105947.jpg
2017-06-01-105947.jpg [ 50.09 КБ | Просмотров: 788 ]

Рассмотреть это сложно - удёт засветка WEB-камеры светодиодами ... да и выглядит это "в натуре" ужасно - сплетение проводов ... но, единственный плюс, коммутируется это в 30 секунд.


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Arduino
Непрочитанное сообщениеДобавлено: 01 июн 2017, 11:55 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
А вот куда интереснее пример (я его где-то списал ... не помню, а потом несколько поэкспериментировал)...
Измеритель номинала ёмкости радиотехнических конденсаторов:
- цифровой вывод 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
a3.png [ 30.83 КБ | Просмотров: 788 ]

Номинал указанный на конденсаторе (электролит) - 480 uF


Вложения:
Kondensator.ino [3.29 КБ]
Скачиваний: 26
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Arduino
Непрочитанное сообщениеДобавлено: 01 июн 2017, 12:07 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
И ещё такая развлекуха: регулирование потенциометром (напряжением с ползунка) яркости свечения (напряжения запитывания) светодиода:
Код:
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 байт]
Скачиваний: 25
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Arduino
Непрочитанное сообщениеДобавлено: 01 июн 2017, 16:25 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
Ещё одно развлечение - на использование функций, как библиотечных, так и собственных...
Управление яркостью 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
a5.png [ 82.23 КБ | Просмотров: 787 ]
a4.png
a4.png [ 25.87 КБ | Просмотров: 787 ]
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Arduino
Непрочитанное сообщениеДобавлено: 01 июн 2017, 18:56 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
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 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
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 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
Двунаправленный обмен 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
a14.png [ 49.02 КБ | Просмотров: 786 ]
a10.png
a10.png [ 15.77 КБ | Просмотров: 786 ]
a11.png
a11.png [ 19.83 КБ | Просмотров: 786 ]
a12.png
a12.png [ 15.61 КБ | Просмотров: 786 ]
a13.png
a13.png [ 22.7 КБ | Просмотров: 786 ]
InOut.ino [456 байт]
Скачиваний: 24
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Arduino
Непрочитанное сообщениеДобавлено: 02 июн 2017, 12:40 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
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 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
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
a1.png [ 69.29 КБ | Просмотров: 767 ]
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Arduino
Непрочитанное сообщениеДобавлено: 02 июн 2017, 13:33 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10718
Откуда: Харьков
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, без её запуска...


Вернуться к началу
 Профиль Отправить личное сообщение  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
[ Time : 0.280s | 17 Queries | GZIP : On ]