top of page

                Простое УЦИ

Простое УЦИ для поперечной подачи токарного станка.

На основе 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();                         // Очистить выходной буфер.

}





 

bottom of page