Инструменты пользователя

Инструменты сайта


arduino_01

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
arduino_01 [2019/06/25 16:42]
golikov создано
arduino_01 [2019/06/26 15:23]
golikov
Строка 1: Строка 1:
-Тестовая страница+====== Дистанционное сканирование с помощью УЗ дальномера. ====== 
 + 
 +===== Знакомство с ультразвуковым дальномером HC-SR04. ===== 
 + 
 +Ультразвуковой дальномер HC-SR04 определяет расстояние до объектов с использованием ультразвука частотой 40 кГц. ​Таким же способом это делают летучие мыши и дельфины. Он излучает звук на частоте 40 кГц и слушает отраженное эхо. По времени движения звуковой волны туда и обратно рассчитывается ​расстояние до предмета. 
 + 
 +На показания ультразвукового дальномера не влияет засветка от солнца и цвет предмета. Он позволяет обнаружить даже прозрачную поверхность предмета. Испытывает сложности с измерением расстояний до пушистых предметов. 
 + 
 +{{:​ultrasonic-sensor-pinout.png?​400|}} 
 + 
 +Конфигурация выводов дальномера HC-SR04  
 + 
 +{{:​image_5.png?​600|}} 
 + 
 +Параметры HC-SR04 
 +  * Напряжение питания:​ 5 В 
 +  * Потребление в режиме тишины:​ 2 мА 
 +  * Потребление при работе:​ 15 мА 
 +  * Диапазон измерения расстояний:​ от 5 до 400 см 
 +  * Угол наблюдения:​ 30° 
 + 
 +Для работы с ультразвуковым дальномером необходимо установить библиотеку Ultrasonic от разработчика Erick Simões.  
 +Откройте меню Инструменты и выберите раздел Управления библиотеками. 
 + 
 +{{:​image_1.png?​500|}} 
 + 
 +Введите в строку поиска слово «ultrasonic».  
 + 
 +{{:​image_2.png?​400|}} 
 + 
 +  
 +Прокрутите перечень библиотек и найдите библиотеку Ultrasonic by Erick Simões 
 + 
 +{{:​image_3.png?​300|}} 
 + 
 +  
 +Нажмите на кнопку Установки. 
 + 
 +{{:​image_4.png?​100|}} 
 + 
 +  
 +Теперь можно открыть тестовый скетч в разделе меню Файл – Примеры – Ultrasonic и протестировать работу датчика. 
 + 
 + 
 + 
 + 
 +===== Пример кода программы для Arduino ===== 
 + 
 + 
 +<file c Ultrasonic.ino>​ 
 + 
 +#include <​OrbicraftBus.h>​ 
 +#include <​Ultrasonic.h>​ 
 + 
 + * Module HR-SC04 (four pins) 
 + * --------------------- 
 + * | HC-SC04 | Arduino | 
 + * --------------------- 
 + * |   ​Vcc ​  ​| ​  ​5V ​   | 
 + * |   ​Trig ​ |   ​6 ​    | 
 + * |   ​Echo ​ |   ​7 ​    | 
 + * |   ​Gnd ​  ​| ​  ​GND ​  | 
 + * --------------------- 
 + 
 +Message msg; 
 +OrbicraftBus bus; 
 +Ultrasonic ultrasonic(6,​ 7);  // подключаем ​ HC-SR04 к пинам 6 (Trig) и 7 (Echo) 
 +int distance; 
 +int16_t msgSize = 0; 
 + 
 +void setup() { 
 +  Serial1.begin(9600);​ // задаем скорость обмена информацией по Serial1 ​  !!! 
 +
 +  
 +void loop() { 
 +  distance = ultrasonic.read(); ​ // считываем расстояние 
 +  msgSize = bus.takeMessage(msg);​ // пробуем прочитать сообщение с помощью метода takeMessage 
 +   
 +  if (msgSize > 0){ //если сообщение есть 
 +    switch (msg.id){//​в зависимости от идентификатора сообщения выполняем те или иные действия 
 +  
 +      // Рассмотрим случай с идентификатором 2 
 +        case 0x02:{ 
 +        String data = String(distance);​ // записываем показания датчика расстояния в переменную data 
 +        bus.sendMessage(bus.obcAddress,​ 0, data); // передаем содержимое переменной data на БКУ 
 +        break; 
 +      } 
 +    } 
 +  } 
 +
 +// Следующий блок кода необходимо всегда добавлять в конец программы 
 +// Функция вызывается автоматически и необходима для обработки сообщения 
 +void serialEvent2() { 
 +  bus.serialEventProcess();​ 
 +
 +</​file>​ 
 + 
 +===== Пример кода программы для Орбикрафт ===== 
 + 
 +<file c Scan.c>​ 
 +#include "​libschsat.h"​ 
 +const float kd = 200.0; 
 + 
 +// Временной шаг работы алгоритма,​ с 
 +const float time_step = 0.1; 
 + 
 +// Целевая угловая скорость спутника,​ град/​с. 
 +// Для режима стабилизации равна 0.0. 
 +const float omega_goal = 5.0; 
 + 
 +// Номер маховика 
 +const int mtr_num = 1; 
 + 
 +// Максимально допустимая скорость маховика,​ об/​мин 
 +const int mtr_max_speed = 3000; 
 + 
 +// Номер ДУС (датчика угловой скорости) 
 +const  uint16_t hyr_num = 1; 
 +int16_t mtr_new_speed;​ 
 +int motor_new_speed_PD(int mtr_speed, int omega, float omega_goal){ 
 + /* Функция для определения новой скорости маховика. 
 + ​Новая скорость маховика складывается из 
 + ​текущей скорости маховика и приращения скорости. 
 + ​Приращение скорости пропорционально ошибке по углу и ошибке по угловой скорости. 
 + ​mtr_speed - текущая угловая скорость маховика,​ об/​мин 
 + omega - текущая угловая скорость спутника,​ град/​с 
 + ​omega_goal - целевая угловая скорость спутника,​ град/​с 
 + ​mtr_new_speed - требуемая угловая скорость маховика,​ об/​мин*/​ 
 +   
 + mtr_new_speed = (int)(mtr_speed + kd * (omega - omega_goal));​ 
 +  
 + if (mtr_new_speed > mtr_max_speed) 
 +
 + mtr_new_speed = mtr_max_speed;​ 
 +
 + else if (mtr_new_speed < -mtr_max_speed) 
 +
 + mtr_new_speed = -mtr_max_speed;​ 
 +
 + return mtr_new_speed;​ 
 +
 + 
 +void initialize_all(void){ 
 +/​*Функция включает все приборы,​которые будут использоваться в основной программе.*/​ 
 + printf("​Enable motor №%d\n",​ mtr_num);  
 + motor_turn_on(mtr_num);​ 
 + Sleep(1);​ 
 + printf("​Enable angular velocity sensor №%d\n",​ hyr_num);  
 + hyro_turn_on(hyr_num);​ 
 + Sleep(1);​ 
 + } 
 +  
 +void switch_off_all(void){ 
 +/* Функция отключает все приборы,​которые будут использоваться в основной программе.*/​ 
 + printf("​Finishing..."​);​ 
 + int16_t new_speed = mtr_new_speed;​ // 
 + printf("​\nDisable angular velocity sensor №%d\n",​ hyr_num); 
 + hyro_turn_off(hyr_num);​ 
 + motor_set_speed(mtr_num,​ 0, &​new_speed);​ 
 + Sleep (1); 
 + motor_turn_off(mtr_num);​ 
 + printf("​Finish program\n"​);​ 
 +
 + 
 +void control(void){ 
 + char answer[255];​ // Создаем массив для сохранения ответа 
 + //nt32_t count = 100; // Устанавливаем счетчик на 5 шагов 
 +  
 + initialize_all();​ 
 + // Инициализируем статус маховика 
 + int16_t mtr_state;​ 
 + // Инициализируем статус ДУС  
 + int16_t hyro_state = 0; 
 + int16_t pRAW_dataX = 0; 
 + int16_t pRAW_dataY = 0; 
 + int16_t pRAW_dataZ = 0; 
 + int16_t *gx_raw = &​pRAW_dataX;​  
 + int16_t *gy_raw = &​pRAW_dataY;​  
 + int16_t *gz_raw = &​pRAW_dataZ;​ 
 + int16_t speed = 0; 
 + int16_t *mtr_speed = &​speed;​ 
 + int16_t omega; 
 + int i; 
 + for(i = 0; i < 500; i++){ 
 +  
 + int status = arduino_send(0,​ 2, NULL, answer, 100); 
 + if (status == 0){ 
 + printf("​%s\r\n",​ answer); 
 +
 + else{ 
 + printf("​ErrorSend\r\n"​);​ 
 +
 +  
 + //​printf("​i = %d\n", i); 
 + // Опрос датчика угловой скорости и маховика. 
 + hyro_state = hyro_request_raw(hyr_num,​ gx_raw, gy_raw, gz_raw);  
 + mtr_state = motor_request_speed(mtr_num,​ mtr_speed);​ 
 +  
 + // Обработка показаний датчика угловой скорости,​ 
 + // вычисление угловой скорости спутника по показаниям ДУС. 
 + // Если код ошибки ДУС равен 0, т.е. ошибки нет 
 + if (!hyro_state){ 
 + float gz_degs = *gz_raw * 0.00875; 
 + omega = gz_degs; 
 +
 + else if (hyro_state == 1){ 
 + printf("​Fail because of access error, check the connection\n"​);​ 
 +
 + else if (hyro_state == 2){ 
 + printf("​Fail because of interface error, check your code\n"​);​ 
 +
 +  
 + int mtr_new_speed;​ 
 + //​Обработка показаний маховика и установка требуемой угловой скорости. 
 + if (!mtr_state) { 
 + // если код ошибки 0, т.е. ошибки нет 
 + int16_t mtr_speed=0;​ 
 + motor_request_speed(mtr_num,​ &​mtr_speed);​ 
 + //​printf("​Motor_speed:​ %d\n", mtr_speed);​  
 + // установка новой скорости маховика 
 + mtr_new_speed = motor_new_speed_PD(mtr_speed,​omega,​omega_goal);​ 
 + motor_set_speed(mtr_num,​ mtr_new_speed,​ &​omega);​ 
 +
 +
 + Sleep(time_step);​ 
 + switch_off_all();​ 
 +
 +</​file>​ 
 + 
 +===== Анализ полученных данных ===== 
 + 
 +Результатом работы программы будет большой массив данных,​ выведенных Орбикрафтом на экран. Для обработки этих данных следует использовать Excel. 
 +Скопируйте данные,​ и вставьте их в один столбец Excel. 
 +Постройте график высот на основе полученных данных. 
 + 
 +{{:​image_6.png?​400|}} 
arduino_01.txt · Последние изменения: 2020/03/25 16:28 (внешнее изменение)

Инструменты страницы