С помощью планшета Windows, Arduino и HC-SR04 вы можете создать графический штангенциркуль для отображения расстояния.
О проекте
Для многих из нас «мигающий светодиод» является первой отправной точкой для написания кода Arduino.
А вот ультразвуковой измерительный сенсор HC-SR04 может стать одним из первых устройств в нашем хобби-наборе Arduino.
На нашем сайте можно найти несколько проектов связанных с HC-SR04. Вы можете посмотреть уроки:
- Измерение расстояния с помощью ультразвукового датчика
- Датчик движения с Arduino, HC-SR04 и светодиодом (LED)
- Дальномер с помощью датчика HC SR04 и Arduino
Но этот проект будет охватывать обычный серийный вывод Arduino:
и графическое представление расстояния таким образом:
Комплектующие
Для нашего проекта на основе Arduino и HC-SR04 понадобится очень мало деталей:
Аппаратное обеспечение
- Arduino UNO & Genuino UNO × 1
- Сенсор HC-SR04 (Generic) × 1
- Планшет Windows × 1
Программное обеспечение
Схема соединения
Все детали, а их у нас немного, нужно соединить следуя схеме ниже:
Программное обеспечение
Вам нужно будет загрузить и установить программное обеспечение GEMstudio Pro от Amulet Technologies.
Это бесплатная 30-дневная пробная версия, но даже после 30 дней программное обеспечение по-прежнему работает, вы просто будете получать раздражающее всплывающее сообщение при запуске программы.
Вам также необходимо загрузить и установить библиотеку Arduino Amulet Communication. Библиотеку и инструкции по установке можно найти на Github.
Репозиторий содержит несколько примеров для Arduino, так что вы сможете посмотреть, как используется библиотека.
GEMstudio Pro
Для этого проекта используются только два изображения:
Сохраните эти два изображения на вашем компьютере. Затем вы можете использовать их вместе с приложенным файлом проекта Amulet, графический интерфейс может отображаться на экране вашего компьютера.
В предыдущих проектах мы показывали как использовать GEMustudio. Мы показывали как создать свой проект и импортировать изображения, используемые в проекте.
Прикрепляем файл проекта GUI.
Файл проекта имеет расширение .gemp. Это читаемый текстовый файл. Просто скопируйте текст ниже и сохраните его как caliper.gemp. Затем просто откройте этот файл в программном обеспечении gemstudio.
<?xml version="1.0" encoding="UTF-8"?><GEMProject GEMstudioVersion="3.3.0.1" CompilerVersion="V3.3.0.1"><COMPLETE_MODULE><LCD_CONFIG><SIZE>1280 x 800</SIZE><MFG>Amulet</MFG><NAME>HP-STREAM.tft</NAME></LCD_CONFIG><BOARD>HPMK-070C (High Performance Capacitive 7 GEMstarter-kit).board</BOARD><OS_SPECIFIC><PROTOCOL>CRC</PROTOCOL><ROTATION>No</ROTATION><COLOR_DEPTH>32</COLOR_DEPTH><DISABLE_MSD>False</DISABLE_MSD><SECURITY_OVERRIDE>False</SECURITY_OVERRIDE></OS_SPECIFIC></COMPLETE_MODULE><CACHE_FONTS>TRUE</CACHE_FONTS><AMULET_ID>1</AMULET_ID><BAUD></BAUD><BAUD0>115200</BAUD0><BAUD1>115200</BAUD1><BAUD2>115200</BAUD2><BGCOLOR>#FFFFFF</BGCOLOR><BUFFER>Double</BUFFER><DISABLE_MSD>False</DISABLE_MSD><GS_STRING_BUFFER_SIZE>100</GS_STRING_BUFFER_SIZE><GS_COMPRESS>False</GS_COMPRESS><GS_DRAW>True</GS_DRAW><HOST_ID>2</HOST_ID><JPEG>Native</JPEG><NULL_TERMINATE>No</NULL_TERMINATE><SECURITY_OVERRIDE>False</SECURITY_OVERRIDE><STRICT_MODBUS_TIMING>No</STRICT_MODBUS_TIMING><SLAVE_RSP>Full Protocol</SLAVE_RSP><TIMEOUT>0.20</TIMEOUT><TOUCH_PRIORITY>From Top to Bottom</TOUCH_PRIORITY><PAGE_BUFFER_SIZE>0x10000</PAGE_BUFFER_SIZE><TRANSITIONS>Clear Screen With Background Color</TRANSITIONS><UTF8_META_STRINGS>No</UTF8_META_STRINGS><MACRO_FILE></MACRO_FILE><LANG_FILE></LANG_FILE><INTERNALRAM_INIT></INTERNALRAM_INIT><IR_INIT_Include_in_POT_File>FALSE</IR_INIT_Include_in_POT_File><PAGE NAME="Page_1"><PROPERTIES><HEAD><BGCOLOR>#363636</BGCOLOR><GS_DRAW>True</GS_DRAW><TRANSITIONS>Clear Screen With Background Color</TRANSITIONS><FUNCTIONS charPos="451" foldedLines=""><script> /************************************************************************************ Name: move_field Arguments: none Returns: none moveField is a public function that is called by the Amulet OS ************************************************************************************/ public moveField() { new int currentx = Amulet:internalRAM.byte(0).value() #define currenty 100 #define width 1280 - 409 //(gaugeWidth - handleWidth) #define range 200 //(max - min) #define offset 100 // Limit Check value if (currentx > 200) currentx = 200 currentx = (currentx * (width)) / (range) + offset //Move the field by updating its X coordinates, then //redraw gauge/numeric field return to the OS Amulet:document.MyNumField_1.disappear() Amulet:document.MyNumField_1.setX(currentx) Amulet:document.MyNumField_1.forceUpdate() Amulet:document.MyNumField_1.reappear() Amulet:document.MyGauge_1.forceUpdate() } </SCRIPT> <META HTTP-EQUIV="REFRESH" CONTENT="0.05; URL=GEMscript.moveField();Name=move_field"> </FUNCTIONS></HEAD></PROPERTIES><BKGND/><BODY><LinearGauge><Name Type="12">MyGauge_1</Name><invisible Type="2" Editable="True">False True False</invisible><backgroundImage Type="16" Editable="True">.Images\calipers-bigge2.png</backgroundImage><cacheImage Type="2" Editable="True">True True False</cacheImage><href Type="24" Editable="True">Amulet:internalRAM.byte(0).value()</href><max Type="13" Editable="True">200</max><min Type="13" Editable="True">0</min><minAt Type="10" Editable="True">Left Left Right</minAt><pointerImage Type="16" Editable="True">.Images\indicator-big.png</pointerImage><updateFreq Type="20" Editable="True">0.2</updateFreq><updateDelay Type="20" Editable="True">0.01</updateDelay><waitForInit Type="2" Editable="True">False False True</waitForInit><MidX Type="13">640</MidX><MidY Type="13">233</MidY><Width Type="13">1286</Width><Height Type="13">439</Height></LinearGauge><NumericField><Name Type="12">MyNumField_1</Name><invisible Type="2" Editable="True">False True False</invisible><border Type="13" Editable="True">0</border><borderColor Type="11" Editable="True">#000000FF</borderColor><fillColor Type="11" Editable="True">#FFFFFF00</fillColor><font Type="14" Editable="True">Bitstream Vera Sans, 36pt</font><fontColor Type="11" Editable="True">#000000</fontColor><fontStyle Type="18" Editable="True">Bold Bold Italic</fontStyle><horizontalAlign Type="10" Editable="True">Right Center Left Right</horizontalAlign><href Type="24" Editable="True">Amulet:internalRAM.byte(0).value() </href><min Type="13" Editable="True">0</min><max Type="13" Editable="True">200</max><maxFld Type="12" Editable="True">200</maxFld><minFld Type="12" Editable="True">0</minFld><printf Type="12" Editable="True">%3i</printf><updateFreq Type="20" Editable="True">0</updateFreq><updateDelay Type="20" Editable="True">0.01</updateDelay><verticalAlign Type="10" Editable="True">Middle Bottom Middle Top</verticalAlign><waitForInit Type="2" Editable="True">False False True</waitForInit><MidX Type="13">592</MidX><MidY Type="13">187</MidY><Width Type="13">122</Width><Height Type="13">62</Height></NumericField></BODY></PAGE></GEMProject>
После того, как вы прочитаете этот gemp-файл, вам нужно будет ввести два изображения.
Код проекта
Скачать или скопировать код вы можете ниже:
#include <NewPing.h> #include <AmuletLCD.h> #define TRIGGER_PIN 8 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm. #define VDP_SIZE 32 //Virtual Dual Port memory used for communicating with Amulet Display uint8_t AmuletBytes[VDP_SIZE] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; byte hexValue; NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance. AmuletLCD myModule; void setup() { //start communication with Amulet Display at default baud myModule.begin(115200); //register our local buffer with Amulet state machine myModule.setBytePointer(AmuletBytes,VDP_SIZE); } void loop() { hexValue = byte(sonar.ping_cm()); myModule.setByte(0, hexValue); delay(200); } //This method automatically gets called if there is any serial data available //http://www.arduino.cc/en/Tutorial/SerialEvent void serialEvent() { myModule.serialEvent(); //send any incoming data to the Amulet state machine }
Используя библиотеку Newping и Amulet, код в цикле сводится к 3 строкам кода:
hexValue = byte(sonar.ping_cm()); myModule.setByte(0, hexValue); delay(200);
- Arduino считает значение с HC-SR04.
- Значение отправляется на компьютер.
- Ожидание 200 мс.
Скомпилируйте и загрузите код в Arduino.
В конце мы должны получить вот такой результат:
На этом всё. Хороших вам проектов.