Архив метки: Робот пылесос доработка

Робот пылесос своими руками, программирование микроконтроллеров AVR

1. АЛГОРИТМ РАБОТЫ ПЫЛЕСОСА
2. ФОТОГРАФИЯ
3. СХЕМА АЛГОРИТМА РАБОТЫ ПЫЛЕСОСА
4. ЭЛЕКТРИЧЕСКАЯ СХЕМА МОДУЛЯ УПРАВЛЕНИЯ
5. КОД ПРОГРАММЫ

АЛГОРИТМ РАБОТЫ ПЫЛЕСОСА
Фотография
СХЕМА АЛГОРИТМА РАБОТЫ ПЫЛЕСОСА
ЭЛЕКТРИЧЕСКАЯ СХЕМА МОДУЛЯ УПРАВЛЕНИЯ
КОД ПРОГРАММЫ

Первая попытка оказалась не очень успешной, так как время выключения мотора пылесоса стоит сделать более длительным. По этой причине, было решено разработать вторую плату.

1. При застревании пылесоса на препятствии, выключается мотор пылесоса, который потребляет больший ток при работе. Если пылесос не может некоторое время преодолеть препятствие, включается режим подруливания, через порт PB3 микроконтроллера.
2. Если долгое время на своем пути пылесос не встречает препятствий, то включается форсированный режим работы мотора пылесоса, то увеличивается мощность всасывания. Управление осуществляется через порт PB0 микроконтроллера/
3. Если пылесос не может более 2 минут преодолеть препятствие, даже после режима подруливания, то он выключается и издается звуковой сигнал длительностью 1минута с интервалом в 15 минут. Управление осуществляется, через порт PB4
4. При разряде аккумулятора до уровня более, чем 3.7В, пылесос выключается и издается звуковой сигнал длительностью 1минута с интервалом в 15 минут. Контроль напряжения аккумулятора осуществляется, через порт PB4 микроконтроллера.
5. Пылесос должен будет с задержкой времени определенной разработчиком включатся два раза в день на 15-25 минут, например с рассветом и начала сумерек.

ВЕРСИЯ 2 КОДА ПРОГАММЫ

/*
* Created: 12.01.2018 12:44:40
* Author: Roman, proftpd@mail.ru
PB0 — форсаж мотора OUT
PB1-управление мотором пылесоса OUT
PB2-контроль движения, препятствий. OUT
PB3- управление мотором движения, подруливание OUT
PB4-состояие АКБ/застрял
АЛГОРИТМ:
1. ТЕСТ: включили мотор (.), включили форсаж (..), включили подруливание (-..)
2. Поехали
3. Если нет препятствий, то включили форсаж (..)
4. Если есть препятствие, ждем, а потом включаем подруливание. Звуковой сигнал (—)
5. Пытаемся выехать, но не можем (—)
6. Если не удалось выехать, то выключаем моторы и включаем звуовой сигнал (SOS).

СТАРТ -в формате Морзе START
ТЕСТ МОТОРА:
1. . мотор 1
2. .. мотор 1 форсаж
3. — .. мотор 2

Включение мотора: — .
Включение форсаж: -..
При застревании — (—) с паузой 3 секунды в течение 45 секунд
Подруливание, преодоление препятствия — 1 длинный звуковой сигнал
Остановка по причине разряда АКБ АЗбукой Морзе AKB с паузой 30 сек
Остановка по причине застревания АЗбукой Морзе SOS с паузой 30 сек

Убрал двоной звуковой сигнал в режиме Форсаж
Теперь, один звуковой сигнал, включили пылесос, два звуковых сигнала -выключили пылесос

16/01/18 Доработал проверку перегрузки мотора 2, чтобы чаще отключал мотор1 при застревании
*/

.include «tn13adef.inc»
.dseg ;сегмент данных
.CSEG
.ORG 0x0000

.def tmpa = R21 ; длительность
.def tmpb = R22 ; длительность
.def time = R23; время, через которое включим двигатель пылесоса, при отсутствии препятствий на пути
.ORG 0x0000

.def tmpa = R21 ; длительность
.def tmpb = R22 ; длительность
.def time = R23; время, через которое включим двигатель пылесоса, при отсутствии препятствий на пути
;.def time1 = R24; время, через которое включим двигателя пылесоса в режиме Форсаж, при отсуттвии препятствий на пути
.def time2 = R25; время, через которое начинаем подруливат мотором управления
.def time3 = R26; время, через которое отключаем пылесос, так как он не может выехать

.equ motor1 = 0x32; время по истечении которого включается мотор пылесоса 10 сек
;.equ motor2 = 0x32; время по истечении которого включается мотор пылесоса в режиме Форсаж 10 сек
.equ motor3 = 0x04; время по истечении которого начинаем подруливать 45сек
.equ motor4 = 0x06 ; время подруливания на преодоление препятствия 120 сек

.equ drive1 = 1; управление мотором 1
.equ drive1_force = 0; управление мотором 1 в режиме форсаж
.equ drive2 = 3; Управление мотором 2 в режиме подруливания
.equ zoom = 4; звуковой сигнал
.equ road = 2 ; дорога

clr R16
ldi R16, 0b00001011
out DDRB, R16 ; PB0, PB1, PB3 out, PB2, PB4 — in
ldi R16, 0b00010100; PB0, PB1, PB3= 0, мотор пылесоса отключен
out PORTB, R16

ldi time, motor1; время, через которое включим двигатель пылесоса, при отсутствии препятствий на пути
;ldi time1, motor2; время по истечении которого включим режим форсаж
ldi time2, motor3; время через которое начинаем подруливание
ldi time3, motor4; ; время по истечении отключаем пылесос, так как он не может выехать

start:
;rcall pause_3sec
;rcall symbol_S
;rcall symbol_T
;rcall symbol_A
;rcall symbol_R
;rcall symbol_T
rcall pause_3sec
rcall motor_test; поочередная проверка всех моторов

;##################################################################################################
; НАЧАЛО ПРОГРАММЫ
;##################################################################################################

start_job0:
ldi time, motor1; отсчет времени включения мотора
ldi time2, motor3; время через которое начинаем подруливание +++
start_job:
rcall pause_d100
dec time ; 0x32=50
cpi time,0
breq motor_start_1_0; включаем мотор по истечение 5sec, если на пути нет препятствий
; Косяк, так как посадил на одну ногу с зумером
;in R16, PINB; проверка состояние АКБ
;sbrs R16, 4; пропуск следующей команды, если PINB4=1
;rjmp time4_end ; Остановка работы пылесоса по причине разряда АКБ
in R16, PINB
sbrc R16, road; пропук следующей команды, если PINB2=0. т.е. пылесос застрял
rjmp start_job
rjmp obstacle

motor_start_1_0:
rcall sound
rjmp motor_start_1

obstacle: ; Проверка поверхности на наличие препятствий или качества поверхности
cbi PORTB, drive1_force ; остановка режима форсаж
cbi PORTB, drive1 ; остановка мотора1 пылесоса
obstacle1:
rcall pause_3sec
rcall sound_long ; Звуковая индикация при застревании 2-ва длинных с паузой в 3 секунды
rcall sound_long
dec time2
cpi time2,0
breq time2_end
in R16, PINB
sbrs R16, road; пропуск следующей команды, если PINB2=1. То есть препятстивие закончилось
rjmp obstacle1
rjmp start_job0 ; вернулись, если препятствие закончилось

;###################################################################################################
; Преодоление препятствия
;##################################################################################################
time2_end:
rcall sound_long
rcall sound_long
rcall sound_long

sbi PORTB, drive2 ; Мотор2 старт форсаж
rcall pause_3sec
cbi PORTB,drive2; Мотор2 стоп форсаж
rcall pause_3sec

in R16, PINB
sbrs R16, road; пропустить следующую команду, если PINB2=1, то есть пылесос преодолел препятствие, то есть не топчемся на одном месте перезапуска ведущий мотор2
rjmp time2_end_1

sbi PORTB,drive2
rcall pause_3sec
rcall pause_3sec
cbi PORTB,drive2
rcall pause_3sec

time2_end_1:
dec time3; время подруливания
cpi time3,0
breq time3_end; Остановка пылесоса по причине застревания
in R16, PINB
sbrs R16, road; пропустить следующую команду, если PINB2=1, то есть пылесос преодолел препятствие
rjmp time2_end
rjmp start_job

time3_end: ; остановка работы пылесоса по причине застревания и передача звукового сигнала SOS с интервалом в 10 мин
cbi PORTB,drive2
ldi R16, 0b00011011
out DDRB, R16 ; PINB4 — out
ldi R16, 0b00010100
out PORTB, R16
rcall symbol_S
rcall symbol_O
rcall symbol_S
rcall pause_3sec
rcall pause_3sec
rcall symbol_S
rcall symbol_O
rcall symbol_S
rcall pause_min
rjmp time3_end

time4_end: ; Звуковой сигнал разрядки АКБ каждые 30 секунд
cbi PORTB, drive2 ; приостановка мотора ведущего мотора 2
ldi R16, 0b00011011
out DDRB, R16 ; PINB4 — out
ldi R16, 0b00010100
out PORTB, R16
rcall symbol_A
rcall symbol_K
rcall symbol_B
rcall pause_15sec
rcall pause_15sec

rjmp time4_end

;##################################################################################
; УПРАВЛЕНИЕ МОТОРОМ
;##################################################################################
motor_start_1: ; На пути нет препятствия. Цикл занимает > 10 sec
in R16, PINB
sbrs R16, road; пропустить команду, если PINB2=1, то есть нет препятствий
rjmp start_job0

sbi PORTB, drive1 ; ON мотор1 пылесоса
rcall pause_3sec_road

sbi PORTB, drive1_force; ON мотор1 режим форсажа
rcall sound
rcall sound

drive2_on: ; Поверхность без препятствий, включаем подруливание
sbi PORTB, drive2 ; чтобы не топтался, когда нет препятствий проверяем каждые 3 сек
rcall pause_3sec_road
rcall pause_3sec_road
cbi PORTB,drive2
rcall pause_3sec_road
sbi PORTB, drive2 ; чтобы не топтался, когда нет препятствий проверяем каждые 3 сек
rcall pause_3sec_road
cbi PORTB,drive2
rcall pause_3sec_road

rjmp drive2_on

;#######################################################################################
; ТЕСТ МОТОРА ПЫЛЕСОСА
;#######################################################################################

motor_test:
ldi R16, 0b00010110; включили мотор пылесоса
out PORTB, R16
rcall pause_3sec
rcall sound
ldi R16, 0b00010111; включили форсаж мотора пылесоса
out PORTB, R16
rcall pause_3sec
rcall sound
rcall sound
ldi R16, 0b00011111; включили мотора движения
out PORTB, R16
rcall pause_3sec
rcall sound_long
rcall sound
rcall sound
ldi R16, 0b00010100; выключили все
out PORTB, R16
rcall pause_3sec
ret

;##################################################################################################
;# ПАУЗЫ
;###################################################################################################
pause_min:
ldi r18, 0x1F; задержка 600 сек
sds:
ldi r17, 0X65 ; 101
dec R18
cpi R18,0
breq pause_min_end

in R16, PINB ; проверяем не закончилось ли препятствие
sbrc R16, road; пропук следующей команды, если PINB2=0. т.е. пылесос застрял
rjmp start_job

pause_min_start:
rcall pause_d200
dec R17
cpi R17,0
breq sds
rjmp pause_min_start
pause_min_end:
ret

pause_15sec:
ldi r17, 0x4C
pause_sec_start:
rcall pause_d200
dec R17
cpi R17,0
breq pause_15sec_end
rjmp pause_sec_start
pause_15sec_end:
ret

pause_3sec_road: ; Для контроля состояния повехноси пауза

ldi r17, 0x10
pause_3sec_road_start:
in R16, PINB
sbrs R16, road; Смотрим каждые 0.2 мС на состояние дороги. Пропустить следующую команду, если PINB2=1, то есть нет препятствий
rjmp start_job0

rcall pause_d200
dec R17
cpi R17,0
breq pause_3sec_road_end
rjmp pause_3sec_road_start
pause_3sec_road_end:
ret

;####################################### ПАУЗА 3 СЕК###################################3
pause_3sec: ; Пауза 3 сек
ldi r17, 0x10
pause_3sec_start:

rcall pause_d200
dec R17
cpi R17,0
breq pause_3sec_end
rjmp pause_3sec_start
pause_3sec_end:
ret

pause_d100: ; 100ms
ldi tmpb, 0x7F;
pause_st1:
ldi tmpa, 0xC0;201=208mks 39.6 ms=37 104 ms= 99
dec tmpb
cpi tmpb,0
breq end_pause1
start_pause1:
dec tmpa
cpi tmpa, 0
breq pause_st1
rjmp start_pause1
end_pause1:
ret

pause_d200: ; 200ms
ldi tmpb, 0xFF; 4.09 mks
pause_st:
ldi tmpa, 0xC0;201=208ms 39.6 ms=37 104 ms= 99
dec tmpb
cpi tmpb,0
breq end_pause
start_pause:
dec tmpa
cpi tmpa, 0
breq pause_st
rjmp start_pause
end_pause:
ret

;##################################################################################################
; СИСТЕМНЫЙ СИГНАЛ
;##################################################################################################
sound_long: ; ТИРЕ
ldi R16, 0b00011011; режим звуковой индикации PB4=1
out DDRB, R16
sbi PORTB,zoom
rcall pause_d100
rcall pause_d100
rcall pause_d100
ldi R16, 0b00001011; PB4=0 в режим контроля АКБ
out DDRB, R16 ;
cbi PORTB, zoom
rcall pause_d100
ret

sound: ; ТОЧКА

ldi R16, 0b00011011; режим звуковой индикации PB4=1
out DDRB, R16
sbi PORTB, zoom
rcall pause_d100
ldi R16, 0b00001011; PB4=0 в режим контроля АКБ
out DDRB, R16 ;
cbi PORTB, zoom
rcall pause_d100
ret

symbol_A: ; .-
rcall sound
rcall sound_long
ret

symbol_B:
rcall sound_long
rcall sound
rcall sound
rcall sound
ret

symbol_K:
rcall sound_long
rcall sound
rcall sound_long
ret

symbol_O:
rcall sound_long
rcall sound_long
rcall sound_long
ret

symbol_R: ;.-.
rcall sound
rcall sound_long
rcall sound
ret

symbol_S:
rcall sound
rcall sound
rcall sound
ret

symbol_T:
rcall sound_long
ret

Разработка ПО 6+6 часов
Разработка схемы и наладка 16 часов
Прочее 2 часа
34 часа


Все авторские права принадлежат Петрову Р.В, RK50.RU