Демонстрационный вариант работы шарпа.
Ну здесь всё просто. Для определения препятствия нам всего лишь надо
считывать данные с ацп. Срабатывание шарпа настроим в проге. Если
требуется измерять расстояние в см, то здесь уже по сложней. Надо
подумать над несколькими формулами, по которым будет считать
расстояние. Я измерять расстояние уже пробовал можно глянуть здесь.
В программе шарп будет срабатывать когда препятствие окажется в
диапозоне, когда АЦП будет меньше или равно 500. Когда он сработает
загорится светодиод.
$regfile = "m16def.Dat" ' мк ATmega16
$crystal = 16000000 ' частота кварца 16мГц
Config Adc = Single , Prescaler = Auto , Reference = Internal 'конфигурация АЦП
Config Pina.2 = Input
Config Portc.4 = Output : Led Alias Portc.4
Dim АЦП As Word
Enable Interrupts 'разрешаем все прерывания
Led = 1 'изначально гасим светодиод
Do
Start Adc 'запускаем аналого-цифровое преобразование
АЦП = Getadc(2) 'считываем результат с пина 2 порта А.
If АЦП >= 500 Then : Led = 0 : Else : Led = 1 : End If
Loop
End
Реальная работа шарпа, которую можно применить на роботе, для объезда препятствий.
Если у
вас есть только один шарп и нет сервопривода, который будет вращать его
на 180, чтобы делать обзор и справа, и слева, но вы хотите чтобы робот
поворачивал в разном направление, то фиксируем его точно по центру и
изменяем программу. Собсно приведённая программа ниже может быть сразу
зашита в мк.
$regfile = "m16def.dat"
$crystal = 16000000
Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Pind.2 = Output : M1f Alias Portd.2
Config Pind.3 = Output : M1b Alias Portd.3
Config Pind.4 = Output : M2f Alias Portd.4
Config Pind.5 = Output : M2b Alias Portd.5
Enable Interrupts
Dim АЦП1 As Word , Выбор_разворота As Bit
Выбор_разворота = 0
Do
Start Adc : АЦП1 = Getadc(2)
If АЦП1 >= 500 Then : Gosub Отъехать_от_препятствия_спереди : Else : Gosub Вперёд : End If
Loop
Вперёд:
M1f = 1 : M2f = 1
M1b = 0 : M2b = 0
Return
Назад:
M1f = 0 : M2f = 0
M1b = 1 : M2b = 1
Return
Разворот_вправо:
M1f = 1 : M2f = 0
M1b = 0 : M2b = 1
Return
Разворот_влево:
M1f = 0 : M2f = 1
M1b = 1 : M2b = 0
Return
'**********************Отъезд от препятствия по центру**************************
Отъехать_от_препятствия_спереди:
Do
Start Adc : АЦП1 = Getadc(2) : Stop Adc
Gosub Назад
Loop Until АЦП1 <= 300
If Выбор_разворота = 0 Then : Gosub Разворот_вправо : Else : Gosub Разворот_влево : End If
Wait 1 'Время разворота
If Выбор_разворота = 0 Then : Выбор_разворота = 1 : Else : Выбор_разворота = 0 : End If 'Переустанавливаем переменную
Return
Скачать демонстрационный вариант.
Скачать для объезда препятствий. |