В данной статье представлю опыт разработки многоцелевой платформы, аналогичной Arduino. Разработка платформы обеспечивала достижение следующих целей:
1. освоение редактора EAGLE CAD.
2. подготовка проекта к производству (учет особенностей при трассировке)
3. опыт монтажа компонентов.
4. вывод — наличие платформы с качествами Arduino и приятными дополнениями.
Состав платформы выбран следующий:
1. микроконтроллер Atmega48/8/168/328

2. линейный интегральный стабилизатор 7805

3. микросхема-календарь PCF8583P

4. драйвер двигателей L293D

Принципиальная схема очень простая, на первый взгляд бросаются очевидные вещи (отсутствие батарейки для часов).

Общий вид трассированной схемы.

Плата в сборе

Программируется микроконтроллер через разъем ISP.
Репозиторий с проектом
https://GlepFingerman@bitbucket.org/GlepFingerman/baseatmelboard.git
Репозиторий библиотеки для микросхемы PCF8583P
git@github.com: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);
}
