This shows you the differences between two versions of the page.
en:arduino_01 [2020/03/25 16:28] |
en:arduino_01 [2020/03/25 16:28] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | FIXME **This page is not fully translated, yet. Please help completing the translation.**\\ //(remove this paragraph once the translation is finished)// | ||
+ | |||
+ | ====== Дистанционное сканирование с помощью УЗ дальномера. ====== | ||
+ | |||
+ | ===== Знакомство с ультразвуковым дальномером 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|}} | ||