При подключении питания НЕ перезагружается Arduino nano
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Моя схема состоит из arduino nano (atmega 328p), дисплея Nokia 5110, сервопривода SG90, двух светодиодов и кнопки. По задумке, в начале сервопривод поворачивается в положение 90 градусов (закрывает коробку), включается красный светодиод, на экране появляется игра, с помощью кнопки нужно пройти эту игру, после прохождения загорается зеленый светодиод и сервопривод отьезжает на 180 градусов и открывает коробку.
От компьтера все работает как нужно, а вот при подключении ардуины к переносной зарядке или при питании от кроны (напрямую без стабилизатора к порту VIN) уже проблема. При первом подключении к переносной зарядке (или кроне), сразу же чуть дребежжит серва, появляется подсветка на дисплее, но дальше ничего не происходит (серва не переходит в положение 90 градусов, на дисплее ничего не появляется, светодиод не загорается). При этом если я нажму на кнопку переагрузки на ардуине, все нормально заработает. Или если быстро выну и обратно вставлю провод переносной зарядки, произойдет перезагрузка ардуины и все зарабтает как надо.
Чувствую что проблема в питании, наверное при подключении питания, питание сразу иде на дисплей+серву+ардуину и ардуина не успевает прогрузится. Посоветуйте что делать, пока что я вижу решение - приделать отдельную кнопку для перезагрузки ардуины, чтобы при подключении внешнего питания перезагружать ее
[spoiler]
#include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <Servo.h> Adafruit_PCD8544 display = Adafruit_PCD8544(12, 11, 10, 9, 8); #include "Sprite.h" #include "Chym.h" #include "Bar.h" Chym player; Bar bar; Bar bar2; int gameScore = 0; int KNOCK_PIN = 3; int SERVO_PIN = 7; int LED_PIN_RED = 5; int LED_PIN_GREEN = 6; boolean clicked = false; unsigned long gameTimerGo = millis(); int gameTimer = 0; Servo servo; void loop(){ } void resetGame() { player.respawn(); bar.setPos(0, 20); bar2.setPos(50, 30); gameScore = 0; gameTimerGo = millis(); gameTimer = 0; } void setup() { delay(300); servo.attach(SERVO_PIN); delay(100); servo.write(90); delay(500); servo.detach(); delay(1000); display.begin(); display.setContrast(60); display.clearDisplay(); display.display(); pinMode(KNOCK_PIN, INPUT_PULLUP); pinMode(LED_PIN_RED, OUTPUT); pinMode(LED_PIN_GREEN, OUTPUT); digitalWrite(LED_PIN_RED, HIGH); digitalWrite(LED_PIN_GREEN, LOW); resetGame(); while(1) { getInput(); player.update(); bar.update(); bar2.update(); drawLCD(); } } void getInput() { int knock = digitalRead(KNOCK_PIN); if (knock == 0) { // push down clicked = true; } else { clicked = false; } } void drawLCD() { display.clearDisplay(); display.setCursor(0,0); gameTimer = (millis() - gameTimerGo) / 1000; display.print(gameTimer); if (!player.isDead()) { int ht1 = bar.hitTest(player.getX(), player.getY()); int ht2 = bar2.hitTest(player.getX(), player.getY()); int die = ht1 + ht2; if (die == 1) { // game over player.die(); } if (clicked) { player.flyUp(); } else { player.cancelJump(); } player.render(); bar.render(); bar2.render(); } else { delay(400); display.clearDisplay(); display.setCursor(0, 0); display.setTextSize(1); display.println(" YOU SURVIVED"); display.print(" "); display.print(gameTimer); display.println(" sec."); if(gameTimer >= 3) { servo.attach(SERVO_PIN); delay(100); servo.write(180); digitalWrite(LED_PIN_RED, LOW); digitalWrite(LED_PIN_GREEN, HIGH); } display.display(); delay(1000); display.println(); display.println("press to start"); display.display(); clicked = false; while(!clicked) { getInput(); delay(50); } resetGame(); } display.display(); }
[/spoiler]
В исходном коде есть парочка классов для игры, но думаю они никак не влияют на проблему.
Ну так либо мощности не хватает у источника питания ( крона ), либо пульсации напряжения большие ( от зарядки). Либо и то и другое в совокупе. Померяйте 5 вольт хотя бы тестером- что там у вас при включении? А дальше в топ про питание. Для начала поставить поближе к серве конденсатор по питанию микрофарад на 1000.
Ну так либо мощности не хватает у источника питания ( крона ), либо пульсации напряжения большие ( от зарядки). Либо и то и другое в совокупе. Померяйте 5 вольт хотя бы тестером- что там у вас при включении? А дальше в топ про питание.
Пока нет врозможностри померить напряжение, могу сказать что переносная зарядка на 6 LI-ION аккумуляторах, подключенных паралелльно (вытащенных из батареи ноутбука). Питания, по всей видимости, не хватает чтобы побороть начальный импульс при включении, потому что когда переносная зарядка (или крона) уже подключены, и я жму на кнопку ресет на ардуине, после ресета все включается.
Вижу способы решения проблемы - либо сделать так чтобы при подключении питания происходила перезагрузка микроконтроллера, либо чтобы сначала питание получал дисплей, потом, через задержку, микроконтроллер (без сервы проблема такая-же), либо как-то побороть эти пульсации вначале
Решил проблему, поставив конденсатор на 4,7 мкФ между выводами RST и GND, теперь перезагрузка при подключении питания происходит всегда
Не ресетом единым.. Если не наладить нормальное питание- будет периодически всё виснуть при срабатывании сервы.
Ну почему? RC-цепь на reset - стандартное решение.