В данной статье представлю опыт разработки многоцелевой платформы, аналогичной Arduino. Разработка платформы обеспечивала достижение следующих целей:
1. освоение редактора EAGLE CAD.
2. подготовка проекта к производству (учет особенностей при трассировке)
3. опыт монтажа компонентов.
4. вывод — наличие платформы с качествами Arduino и приятными дополнениями.
Состав платформы выбран следующий:
1. микроконтроллер Atmega48/8/168/328
2. линейный интегральный стабилизатор 7805
3. микросхема-календарь PCF8583P
4. драйвер двигателей L293D
Принципиальная схема очень простая, на первый взгляд бросаются очевидные вещи (отсутствие батарейки для часов).
Общий вид трассированной схемы.
Плата в сборе
Программируется микроконтроллер через разъем ISP.
Репозиторий с проектом
https://[email protected]/GlepFingerman/baseatmelboard.git
Репозиторий библиотеки для микросхемы PCF8583P
[email protected]:edebill/PCF8583.git
// Тестовый код управления платой #include <Arduino.h> #include <Wire.h> #include <stdio.h> #include <SoftwareSerial.h> #include "PCF8583.h" #include "DFPlayer_Mini_Mp3.h" // директивы обозначения цифровых выводов управления двигателями #define ML1 (PD7) #define MR1 (PD5) #define ML2 (PD6) #define MR2 (PD4) //директивы обозначения цифровых выводов для установленных кнопок #define BT1 (PC3) #define BT2 (PC2) // директива обозначения вывода подключения температурного датчика #define Tmp (PC0) // int correct_address = 0; PCF8583 p (0xA0); // движение вперед void forward() { // digitalWrite(ML1, HIGH); digitalWrite(MR1, LOW); // digitalWrite(ML2, HIGH); digitalWrite(MR2, LOW); } // поворот влево void toLeft() { // digitalWrite(ML1, LOW); digitalWrite(MR1, HIGH); // digitalWrite(ML2, HIGH); digitalWrite(MR2, LOW); } // поворот вправо void toRigth() { // digitalWrite(ML1, HIGH); digitalWrite(MR1, LOW); // digitalWrite(ML2, LOW); digitalWrite(MR2, HIGH); } // движение назад void backward() { // digitalWrite(ML1, LOW); digitalWrite(MR1, HIGH); // digitalWrite(ML2, LOW); digitalWrite(MR2, HIGH); } void Setup() { // активируем последовательный порт Serial.begin(9600); // выводим тестовое сообщение Serial.print("booting..."); Serial.println(" done"); // устанавливаем режим работы цифровых выводов управления двигателями на "выход" pinMode(ML1, OUTPUT); pinMode(MR1, OUTPUT); pinMode(ML2, OUTPUT); pinMode(MR2, OUTPUT); // mp3_set_serial (Serial); mp3_set_volume (25); delay (100); mp3_play (); delay (100); } void loop() { forward(); // настройка часов по последовательному порту if(Serial.available() > 0){ p.year = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)) + 2000; p.month = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); p.day = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); p.hour = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); p.minute = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); p.second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); if(Serial.read() == ';'){ Serial.println("setting date"); p.set_time(); } // получение даты/времени от PCF8583P p.get_time(); char time[50]; sprintf(time, "%02d/%02d/%02d %02d:%02d:%02d", p.year, p.month, p.day, p.hour, p.minute, p.second); Serial.println(time); // чтение АЦП (термодатчик LM35CZ) double tempC = analogRead(Tmp); // вывод в терминал температуры Serial.print("Temp C = "); Serial.println(tempC, DEC); }