Отображение расстояния с помощью HC-SR04 и Ардуино

С помощью планшета Windows, Arduino и HC-SR04 вы можете создать графический штангенциркуль для отображения расстояния.

О проекте

Для многих из нас «мигающий светодиод» является первой отправной точкой для написания кода Arduino.

А вот ультразвуковой измерительный сенсор HC-SR04 может стать одним из первых устройств в нашем хобби-наборе Arduino.

На нашем сайте можно найти несколько проектов связанных с HC-SR04. Вы можете посмотреть уроки:

Но этот проект будет охватывать обычный серийный вывод Arduino:

и графическое представление расстояния таким образом:

Комплектующие

Для нашего проекта на основе Arduino и HC-SR04 понадобится очень мало деталей:

Аппаратное обеспечение

  1. Arduino UNO & Genuino UNO × 1
  2. Сенсор HC-SR04 (Generic) × 1
  3. Планшет 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="">&lt;script&gt;
/************************************************************************************
	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 &gt; 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()
}
&lt;/SCRIPT&gt;
&lt;META HTTP-EQUIV="REFRESH" CONTENT="0.05;
URL=GEMscript.moveField();Name=move_field"&gt;
</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);
  1. Arduino считает значение с HC-SR04.
  2. Значение отправляется на компьютер.
  3. Ожидание 200 мс.

Скомпилируйте и загрузите код в Arduino.

В конце мы должны получить вот такой результат:

На этом всё. Хороших вам проектов.

11 декабря 2018 в 00:51 | Обновлено 7 ноября 2020 в 01:20 (редакция)
Опубликовано:
Статьи, ,

Добавить комментарий

Ваш E-mail не будет никому виден. Обязательные поля отмечены *