В Arduino UNO контроллер собран на ATmega328. У платы четырнадцать входов/выходов, из них шесть могут использоваться как выходы ШИМ (распиновку рассмотрим ниже). Так же есть шесть аналоговых входов.
Плата имеет USB вход, разъем для питания. Кнопку сброса.
Рис. 1 Внешний вид китайской "Arduino UNO"
Родная, итальянская Arduino UNO стоит около 20$, а китайская подделка - 3$, разница только в упаковке :)
Я приобрел Arduino UNO в Китае, ее и буду рассматривать.
Для начала характеристики:
Микроконтроллер - ATmega328Рабочее напряжение - 5 В
Входное напряжение - 7-12 В
Цифровые входы/выходы - 14 (6 из них + ШИМ)
Аналоговые входы - 6
Постоянный ток через вход/выход - 40 мА
Флеш-память - 32 Кб (из них 0.5 Кб загрузчик)
ОЗУ - 2 Кб
EEPROM - 1 Кб
Тактовая частота - 16 МГц
Arduino UNO может быть запитана от USB или от внешнего источника 7-12В. У меня от USB не запускается толком, подключил внешний источник 7В (Переделал зарядное устройство мобилы.)
Распиновка выводов:
POWER
5V - 5В
RES - Сброс
3.3V - 3.3В от внутреннего преобразователя
5V - 5В
GND - Общий
GND - Общий
VIN - Входное питание 7-12 В
ANALOG IN (Аналоговые входы)
A0
A1
A2
A3
A4
A5
DiGiTAL PWM(~) Цифровые входы/выходы (~ - ШИМ)
0 RX-> - Цифровой вход/выход 0 + последовательная шина приема данных
1 TX-> - Цифровой вход/выход 1 + последовательная шина передачи данных
2 - Цифровой вход/выход 2 + Внешнее прерывание
3~ - Цифровой вход/выход 3 + ШИМ + Внешнее прерывание
4 - Цифровой вход/выход 4
5~ - Цифровой вход/выход 5 + ШИМ
6~ - Цифровой вход/выход 6 + ШИМ
7 - Цифровой вход/выход 7
8 - Цифровой вход/выход 8
9~ - Цифровой вход/выход 9 + ШИМ
10~ - Цифровой вход/выход 10 + ШИМ
11~ - Цифровой вход/выход 11 + ШИМ
12 - Цифровой вход/выход 12
13 - Цифровой вход/выход 13
GND - Общий
AREF - Опорное напряжение
SDA - Связь I2C
SDL - Связь I2C
К пину 13 постоянно подключен светодиод L.
Остальные светодиоды на плате:
ON - питание
RX - получение данных
TX - Запись данных (китайцы наоборот вписали)
Для работы с Arduino необходимо скачать программное обеспечение на сайте Arduino (внизу ссылка).
Рис. 2
Затем необходимо удостовериться, на какой микросхеме построен виртуальный COM порт. В китайских вариациях это обычно CH340, на нее надо установить драйвера. Скачать можно внизу статьи. При первом подключении система запросит установку драйвера, указываем путь к скачанной папке.
Рис. 3
В самой программе указываем, какая у нас плата (Arduino UNO) и порт. У меня COM4. Посмотреть порт можно в диспетчере устройств.
Рис. 4
Подключаем к Arduino два светодиода
Рис. 5
Запишем первый скетч
void setup() {
pinMode(12, OUTPUT); //12 пин на вывод
pinMode(13, OUTPUT); //13 пин на вывод
}
void loop() {
digitalWrite(13, HIGH); // включаем светодиод на пине 13
delay(200); // пауза 200 мСек
digitalWrite(13, LOW); // отключаем светодиод на пине 13
delay(200); // пауза 200 мСек
digitalWrite(13, HIGH); // включаем светодиод на пине 13
delay(200); // пауза 200 мСек
digitalWrite(13, LOW); // отключаем светодиод на пине 13
delay(200); // пауза 200 мСек
digitalWrite(12, HIGH); // включаем светодиод на пине 12
delay(200); // пауза 200 мСек
digitalWrite(12, LOW); // отключаем светодиод на пине 12
delay(200); // пауза 200 мСек
digitalWrite(12, HIGH); // включаем светодиод на пине 12
delay(200); // пауза 200 мСек
digitalWrite(12, LOW); // отключаем светодиод на пине 12
delay(200); // пауза 200 мСек
}
Запускаем компиляцию и загрузку и...
Видео работы
Инфо
1. драйвер СР340 (СР341)2. Программное обеспечение Arduino
Цитата:
Надо чтобы цифры были покрупнее (по высоте на весь экран). А то как-то не смотрится и неудобно.
А вообще, сам по себе индикатор хорош, но думается, он может отображать и большие символы (одна цифра на четыре знакоместа).
Или это какие-то специальные часы?
2. Из библиотеки Arduino
3. Найти готовый скетч в интернете
Я следующей статьей хочу затронуть как раз язык Arduino. На самом деле очень простой язык, на основе СИ, все интуитивно понятно, к примеру, в программе в статье в комментариях все расписано.
То есть плата только чтобы учиться кодить на самой плате? Или все коды можно потом в ту же Атмега328 прошивать и она будет работать?
Из популярных, есть arduino mini - нет подключения к компьютеру, но отдельно можно приобрести
Есть еще Arduino Nano - цена тоже мизерная, но это практически аналог UNO - но микроскопических размеров.
Я еще приобрел "знаменитый набор" из 37 модулей (около 10$ то там одно Г.
Т.е. UNO - для отладки, а внедрение уже в Mini
Ну и отет еще на один твой вопрос, ну да, можно в atmega328 залить, развести и будет работать, конечно же. Только, как я сказал выше, это проще делать на Arduino Mini, Atmega стоит 1.4$ а Arduino Mini - 1.8$ При том, что atmega на arduino уже распаяна, есть стаб на 3.3В, кварц...
ПС: где обещанные 40 девственниц, за статьи, которые я писал для сайта?
Да и дело не в библиотеках. Процессорное ядро и периферия в STM32 намного продвинутее чем в ARV ATmega на которой построена ардуина.
Можно, какой-то пример на пальцах, для чайника?
Про флешку информации много.
Делается база эффектов, затем выбирается эффект и выводится последовательно на выводы.
Сам код:
void setup() {
pinMode(6, OUTPUT); //6 пин на вывод
pinMode(7, OUTPUT); //7 пин на вывод
pinMode(8, OUTPUT); //8 пин на вывод
pinMode(9, OUTPUT); //9 пин на вывод
pinMode(10, OUTPUT); //10 пин на вывод
pinMode(11, OUTPUT); //11 пин на вывод
pinMode(12, OUTPUT); //12 пин на вывод
pinMode(13, OUTPUT); //13 пин на вывод
}
void loop() {
digitalWrite(13, HIGH); // включаем светодиод на пине 13
delay(200); // пауза 200 мСек
digitalWrite(13, LOW); // отключаем светодиод на пине 13
delay(200); // пауза 200 мСек
digitalWrite(12, HIGH); // включаем светодиод на пине 12
delay(200); // пауза 200 мСек
digitalWrite(12, LOW); // отключаем светодиод на пине 12
delay(200); // пауза 200 мСек
digitalWrite(11, HIGH); // включаем светодиод на пине 11
delay(200); // пауза 200 мСек
digitalWrite(11, LOW); // отключаем светодиод на пине 11
delay(200); // пауза 200 мСек
digitalWrite(10, HIGH); // включаем светодиод на пине 10
delay(200); // пауза 200 мСек
digitalWrite(10, LOW); // отключаем светодиод на пине 10
delay(200); // пауза 200 мСек
digitalWrite(9, HIGH); // включаем светодиод на пине 9
delay(200); // пауза 200 мСек
digitalWrite(9, LOW); // отключаем светодиод на пине 9
delay(200); // пауза 200 мСек
digitalWrite(8, HIGH); // включаем светодиод на пине 8
delay(200); // пауза 200 мСек
digitalWrite(8, LOW); // отключаем светодиод на пине 8
delay(200); // пауза 200 мСек
digitalWrite(7, HIGH); // включаем светодиод на пине 7
delay(200); // пауза 200 мСек
digitalWrite(7, LOW); // отключаем светодиод на пине 7
delay(200); // пауза 200 мСек
digitalWrite(6, HIGH); // включаем светодиод на пине 6
delay(200); // пауза 200 мСек
digitalWrite(6, LOW); // отключаем светодиод на пине 6
delay(200); // пауза 200 мСек
}
Нравится мне эта игрушка!
long randNumber;
void setup() {
pinMode(6, OUTPUT); //6 пин на вывод
pinMode(7, OUTPUT); //7 пин на вывод
pinMode(8, OUTPUT); //8 пин на вывод
pinMode(9, OUTPUT); //9 пин на вывод
pinMode(10, OUTPUT); //10 пин на вывод
pinMode(11, OUTPUT); //11 пин на вывод
pinMode(12, OUTPUT); //12 пин на вывод
pinMode(13, OUTPUT); //13 пин на вывод
}
void loop() {
// выводим случайное число из диапазона 6..13
randNumber = random(6, 14);
digitalWrite(randNumber, HIGH); // включаем светодиод на случайном пине одного из 6-13
delay(100); // пауза 100 мСек
digitalWrite(randNumber, LOW); // отключаем светодиод на случайном пине одного из 6-13
delay(100); // пауза 100 мСек
}
long randNumber;
void setup() {
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
randNumber = random(6, 14);
digitalWrite(randNumber, HIGH);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, LOW);
randNumber = random(6, 14);
delay(100);
digitalWrite(randNumber, HIGH);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, LOW);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, HIGH);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, LOW);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, HIGH);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, LOW);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, HIGH);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, LOW);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, HIGH);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, LOW);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, HIGH);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, LOW);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, HIGH);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, LOW);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, HIGH);
delay(100);
randNumber = random(6, 14);
digitalWrite(randNumber, LOW);
delay(100);
}
Я начал оформлять ознакомление с ардуино, там не все, но может поможет (крестик открывает подпункты)
Понравилось то, как работает Ардуино с логическим (булевым) типом данных boolean. Такой простой пример: жмём кнопку и отпускаем - включается светодиод, снова жмём кнопку и отпускаем - светодиод гаснет, удерживаем кнопку нажатой - светодиод мигает с периодом в половину секунды. Дребезг контактов кнопки устраняется введением в код паузы delay(500); в половину секунды.
int LEDpin = 12; // Светодиод на входе 12
int switchPin = 5; // выключатель на порту 5, замыкает на землю
boolean running = false;
void setup()
{
pinMode(LEDpin, OUTPUT);
pinMode(switchPin, INPUT);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(switchPin) == LOW)
{
delay(500); // ждем 0.5сек
running = !running; // меняем значение булевой переменной
digitalWrite(LEDpin, running); // включаем или выключаем светодиод.
Serial.println(digitalRead(switchPin)); //считывание значений монитором с порта 5
}
}
Могу помочь с программированием, если что. А продолжать эту тему... В комментариях к статье больше стеба, чем реальной заинтересованности.
А у тебя ардуина на атмега32?
Видео:
Если у тебя Arduino Pro Mini Atmega328 5V-16MHz и есть адаптер, то попробуй соединить их так и заодно проверишь работу светодиода на плате:
После подключения к USB, запусти программу Arduino и выбери всё как на рисунках ниже:
Теперь проверим работу светодиода на плате:
На плате должен начать мигать светодиод с периодом в одну две секунды (исправлено).
#define FIRST_PIN 0 // первый вывод
#define LAST_PIN 19 // последний вывод
void Test1(byte pin)
{
if(pin < 10) Serial.print(" PIN: ");
else Serial.print(" PIN: ");
Serial.print(pin);
pinMode(pin, OUTPUT);
digitalWrite(pin, 0);
Serial.print(" LOW: ");
if(!digitalRead(pin)) Serial.print("OK ");
else Serial.print("FAIL");
digitalWrite(pin, 1);
Serial.print(" HIGH: ");
if(digitalRead(pin)) Serial.print("OK ");
else Serial.print("FAIL");
pinMode(pin, INPUT);
Serial.print(" PULL UP: ");
if(digitalRead(pin)) Serial.print("OK ");
else Serial.print("FAIL");
digitalWrite(pin, 0);
}
void Test2(byte pin)
{
Serial.print(" ");
pinMode(pin, OUTPUT);
digitalWrite(pin, 1);
delay(5);
if(!digitalRead(pin))Serial.println("SHORT");
else Serial.println("OK");
pinMode(pin, INPUT);
digitalWrite(pin, 0);
}
void setup() {
Serial.begin(9600);
Serial.println("Test of short circuit on GND or VCC and between pins:");
Serial.println();
for(byte i = FIRST_PIN; i <= LAST_PIN; i++)
{
for(byte j = FIRST_PIN; j <= LAST_PIN; j++)
{
pinMode(j, INPUT);
digitalWrite(j, 0);
}
Test1(i);
for(byte j = FIRST_PIN; j <= LAST_PIN; j++)
{
pinMode(j, OUTPUT);
digitalWrite(j, 0);
}
Test2(i);
}
for(byte j = FIRST_PIN; j <= LAST_PIN; j++)
{
pinMode(j, INPUT);
digitalWrite(j, 0);
}
}
void loop() {}
/*www.seeed.cc
* A library for the 4 digit display
*
* Copyright (c) 2012 seeed technology inc.
* Website :
* Author : Frankie.Chu
* Create Time: 9 April,2012
* Change Log :
*
* The MIT License (MIT)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <TimerOne.h>
#include "TM1637.h"
#define ON 1
#define OFF 0
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 0;
unsigned char second;
unsigned char minute = 0;
unsigned char hour = 12;
#define CLK 2//pins definitions for TM1637 and can be changed to other ports
#define DIO 3
TM1637 tm1637(CLK,DIO);
void setup()
{
tm1637.set();
tm1637.init();
Timer1.initialize(500000);//timing for 500ms
Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR
}
void loop()
{
if(Update == ON)
{
TimeUpdate();
tm1637.display(TimeDisp);
}
}
void TimingISR()
{
halfsecond ++;
Update = ON;
if(halfsecond == 2){
second ++;
if(second == 60)
{
minute ++;
if(minute == 60)
{
hour ++;
if(hour == 24)hour = 0;
minute = 0;
}
second = 0;
}
halfsecond = 0;
}
// Serial.println(second);
ClockPoint = (~ClockPoint) & 0x01;
}
void TimeUpdate(void)
{
if(ClockPoint)tm1637.point(POINT_ON);
else tm1637.point(POINT_OFF);
TimeDisp[0] = hour / 10;
TimeDisp[1] = hour % 10;
TimeDisp[2] = minute / 10;
TimeDisp[3] = minute % 10;
Update = OFF;
}
Скетч пишем как обычно или берём готовый пример, но в настройках программы Arduino ставим галочку: Файл->Настройки->Компиляция.
Затем жмём проверить скетч. Отправляемся заглянуть в папку c:\Users\Kosmonavt\AppData\Local\Temp\
Здесь отыскиваем папку примерно такого названия arduino_build_747962\
Заходим в неё и ищем файл с расширением *.hex, а точнее Blink.ino.hex
Копируем его адрес, должно выглядеть так: c:\Users\Kosmonavt\AppData\Local\Temp\arduino_build_747962\Blink.ino.hex
В программе Proteus в поле деятельности добавляем плату Arduino Uno и два раза кликаем на сам процессор.
Появится окно, где кроме всего прочего нужно вставить в строку напротив Program File: то что мы скопировали выше и нажать ОК.
Затем нажать знак треугольника (Run the simulation) в левом нижнем углу окна. Всё. Светодиод должен начать мигать.
Пример установки библиотек:
Программный код:
/* Arduino example code to display a 24 hour time format clock on a TM1637 4 digit 7 segment display with a DS32321 RTC. More info:www.makerguides.com */
// Include the libraries:
#include "RTClib.h"
#include <TM1637Display.h>
// Define the connections pins:
#define CLK 2
#define DIO 3
// Create rtc and display object:
RTC_DS3231 rtc;
TM1637Display display = TM1637Display(CLK, DIO);
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Wait for console opening:
delay(3000);
// Check if RTC is connected correctly:
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// Check if the RTC lost power and if so, set the time:
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// The following line sets the RTC to the date & time this sketch was compiled:
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
//rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
// Set the display brightness (0-7):
display.setBrightness(5);
// Clear the display:
display.clear();
}
void loop() {
// Get current date and time:
DateTime now = rtc.now();
// Create time format to display:
int displaytime = (now.hour() * 100) + now.minute();
// Print displaytime to the Serial Monitor:
Serial.println(displaytime);
// Display the current time in 24 hour format with leading zeros enabled and a center colon:
display.showNumberDecEx(displaytime, 0b11100000, true);
// Remove the following lines of code if you want a static instead of a blinking center colon:
delay(1000);
display.showNumberDec(displaytime, true); // Prints displaytime without center colon.
delay(1000);
}
Часы с возможностью установки времени и яркости дисплея отдельными кнопками вручную (кнопку "Уст." при этом нужно удерживать):
#include <Wire.h>
#include "TM1637.h"
// 7 сегментный индикатор
#define CLK 6
#define DIO 7
byte brightness = 7; // яркость, от 0 до 7
// кнопки
#define keyHor 5
#define keyMin 4
#define keyBr 8
#define keyPL 3
TM1637 tm1637(CLK,DIO);
#define DS3231_I2C_ADDRESS 0x68
volatile boolean flag;
///// часы ..
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
return ( (val/16*10) + (val%16) );
}
void setDateDs3231(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void getDateDs3231(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void setINT(){ //включает выход SQW
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0x0E);
Wire.write(0x0);
Wire.endTransmission();
}
void blink() {
digitalWrite(12, !digitalRead(12));
flag = !flag;
tm1637.point(flag);
}
void setup() {
// Serial.begin(9600);
Wire.begin();
pinMode(13, OUTPUT);
pinMode(keyHor, INPUT_PULLUP);
pinMode(keyMin, INPUT_PULLUP);
pinMode(keyPL, INPUT_PULLUP);
pinMode(keyBr, INPUT_PULLUP);
tm1637.init();
tm1637.set(brightness);
setINT();
attachInterrupt(0, blink, CHANGE);
}
void loop(){
// читаем время из модуля
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
// забиваем массив значениями для отправки на экран
int8_t TimeDisp[4];
TimeDisp[0] = hour / 10;
TimeDisp[1] = hour % 10;
TimeDisp[2] = minute / 10;
TimeDisp[3] = minute % 10;
// обработка кнопок
if (!digitalRead(keyHor) && !digitalRead(keyPL)){ // часы
second = 0; // сбрасываем секунды
hour++; // прибавляем единицу к часам
if (hour > 23) hour = 0; // если вылезли за границы присваиваем 0
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишем в модуль
delay(200);
}
if (!digitalRead(keyMin) && !digitalRead(keyPL)){ // минуты
second = 0;
minute++;
if (minute > 59) minute = 0;
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
delay(200);
}
if (!digitalRead(keyBr) && !digitalRead(keyPL)){
brightness++;
if (brightness > 7) brightness = 0;
tm1637.set(brightness);
delay(200);
// отправляем массив на экран
}
tm1637.display(TimeDisp);
}
Готовый код к часам нашёл на просторах интернета. Из недостатков: неудобное управление настройкой времени. Из достоинств: простота сборки, высокая точность.
Собрал на досочке второй вариант часиков. Хорошо работают, время сохраняют без основного питания.