Простое УЦИ
Простое УЦИ для поперечной подачи токарного станка.
На основе Arduino NANO можно собрать простое УЦИ. Схема простая.
Есть выносная кнопка "Уст. 0" и переключатель "Радиус / Диаметр".
Схема платы Arduino NANO :
Печатная плата
Фото готовой платы
Короткое видео
Архив можно скачать здесь
[code]
/* Программа для китайской линейки для NANO
https://sites.google.com/site/marthalprojects/home/arduino/arduino-reads-digital-caliper
https://www.yuriystoys.com/2012/01/reading-gtizzly-igaging-scales-with.html
Автор: Yuriy's Toys
(Дополнения: Карпов. А. А. 22.02.2022г )
7сег. дисплей + MAX7219 8 разрядов дисплея + дец. точка + Линейка (Китай) +
кнопка "Уст. 0" + Переключатель: Радиус/Диаметр + Светодиод "Радиус/Диаметр".
Последняя загрузка 6 марта 2022г.
*/
int i; // Автор. Переменная
int sign; // Автор. Переменная
long value; // Автор. Переменная
float result; // Автор. Переменная для вывода в СОМ порт или на 7сег. индикатор
int clockpin = 4; // Автор. Нога CLK
int datapin = 5; // Автор. Нога Data
unsigned long tempmicros; // Автор. Переменная
boolean KH1; // Кнопка:переменная КН_1 типа boolean, кнопка "Уст. 0"
boolean KH_1_flag = 0; // Кнопка: "Уст. 0"
boolean KH_1; // Кнопка: "Уст. 0"
unsigned long last_press; // Кнопка: "Уст. 0"
boolean RD ; // Переключатель РАДИУС/ДИАМЕТР
float Buffer = 0.00; // Временная переменная для кнопки "Уст.0"
// Настройки для HCMAX7219
#include <HCMAX7219.h> // HCMAX7219: Подключить библиотеку <HCMAX7219.h>
#include "SPI.h" // HCMAX7219: Подключить библиотеку "SPI.h"
#define LOAD 10 // HCMAX7219: Установите цифровой PIN-код НАГРУЗКИ (CS)
HCMAX7219 HCMAX7219(LOAD); // HCMAX7219: Создайте экземпляр библиотеки
#define CLK 3 // Линейка: синхронизация
#define DT 2 // Линейка: данные
byte Position; // Для децим. точки
uint32_t myTimer1; // Переменная для задержки
#define LED_pin 7 // Пин светодиода на 7 ноге
#define RD_Pin 2 // Пин переключателя РАДИУС/ДИАМЕТР на 2 ноге
////////// SETUP //////////
void setup() {
//Serial.begin(9600); // Устанавливаем скорость СОМ порта. (Для отладки раскоментируйте эту строку).
HCMAX7219.Clear(); // Очистить выходной буфер.
pinMode(clockpin, INPUT); // 4 нога CLK для NANO
pinMode(datapin, INPUT); // 5 нога DATA для NANO
pinMode(1, INPUT); // 1 нога ВХОД кнопки "Уст.0" без подтяжки.
pinMode(2, INPUT); // 2 нога ВХОД переключателя РАДИУС/ДИАМЕТР без подтяжки.
HCMAX7219.Clear(); // Очистить выходной буфер.
HCMAX7219.print7Seg("HELLO",8); // Заставка. Здесь 8, это колличество отображаемых знаков.
HCMAX7219.Refresh(); // Отправьте выходной буфер на дисплей.
delay (1000); // Задержка
HCMAX7219.Clear(); // Очистить выходной буфер.
pinMode(LED_pin, OUTPUT); // пин светодиода как выход
pinMode(RD_Pin, INPUT); // пин переключателя РАДИУС/ДИАМЕТР
}
////////// Тело программы //////////
void loop () {
while (digitalRead(clockpin) == HIGH) {} // если синхоимпульс = 0, ждем, пока не станет = 1.
tempmicros = micros();
while (digitalRead(clockpin) == LOW) {} // дождитесь конца лог.1
if ((micros() - tempmicros) > 500) { // если лог.1 был длиннее 500 микросекунд, мы находимся в начале новой последовательности битов
decode(); // ПП - декодировать последовательность битов
}
}
////////// ПП decode //////////
void decode() {
sign = 1;
value = 0;
for (i = 0; i < 23; i++) {
while (digitalRead(clockpin) == HIGH) { } // ждем, пока синхроимпульс станет равен лог.1. Первый бит не нужен.
while (digitalRead(clockpin) == LOW) {} // ждем, пока синхроимпульс станет равен лог.0.
if (digitalRead(datapin) == LOW) {
if (i < 20) {
value |= 1 << i;
}
if (i == 20) {
sign = -1;
}
}
}
result = (value * sign); // result - переменная, где хранятся данные полученные с линейки.
/*************************** КНОПКА установки НУЛЯ *********************/
KH_1 = !digitalRead(1); // считать текущее положение кнопки
if (KH_1 == 1 && KH_1_flag == 0 && millis() - last_press > 100) {
KH_1_flag = 1;
last_press = millis(); //("Кнопка нажата");
}
if (KH_1 == 0 && KH_1_flag == 1){
Buffer = 0;
Buffer = result; // Переписываем результат из result в Buffer
KH_1_flag = 0; //("Кнопка отпущена");
}
else
result = result - Buffer; // После нажатия кнопки "Уст.0" вычитаем из result данные Buffer.
//Serial.print("Длина: "); // Вывод результата в СОМ порт (Для отладки раскоментируйте эту строку).
//Serial.println(result, 2); // Вывод результата в СОМ порт (Для отладки раскоментируйте эту строку).
//delay (1000); // Вывод результата в СОМ порт (Для отладки раскоментируйте эту строку).
/*************************** Переключатель РАДИУС / ДИАМЕТР *********************/
// Переключатель РАДИУС/ДИАМЕТР включен в положение ДИАМЕТР.
RD = digitalRead(RD_Pin ); // считывание состояния значения кнопки:
if (RD==LOW){
digitalWrite(LED_pin, HIGH); // светодиод "горит" предупреждая,что показания дисплея увеличиваються в 2 раза.
result = result * 2; // Умножаем переменную result на 2.
}
else
digitalWrite(LED_pin, LOW); // светодиод "не горит".
///////// Вывод на 7 сег. дисплей и задержка ////////
for (Position = 1; Position <= 7; Position++)
HCMAX7219.print7Seg (result,2,8); // Записываем данные полученные из блока линейки в выходной буфер.
// Здесь:result = переменная выводимая на дисплей. 2 = положение десят. точки. 8 = колличество отображаемых разрядов дисплея.
HCMAX7219.Refresh(); // Отправляем выходной буфер на дисплей
if (millis() - myTimer1 >= 10) { // Задержка: ищем разницу (10 мс)
myTimer1 = millis(); // сброс таймера
}
HCMAX7219.Clear(); // Очистить выходной буфер.
}