Сгибатель кабелей , часть 1
В мире современных технологий мы все сталкиваемся с необходимостью приобретения зарядных кабелей для наших телефонов, ноутбуков и планшетов. На первый взгляд кажется очевидным, что чем дороже кабель, тем выше его качество. Однако, в моей практике однажды произошло обратное, что и вдохновило меня на создание уникального устройства — "сгибателя кабелей".
Недавно я начал изучать программирование и решил применить свои новые знания на практике. Первым шагом стало подключение сервомотора к микроконтроллеру ATmega 128, работающему на частоте 8 МГц. Я использовал цифровую серву с усилием 20 (40) кг, и смог настроить её так, чтобы она вращалась на заданный угол от +90 до -90 градусов.
Однако вскоре я понял, что это устройство, хоть и интересное, не дает полной картины о качестве кабеля. Поэтому в следующей версии я планирую добавить дисплей, кнопку для управления, функцию определения работоспособности кабеля и счетчик количества сгибаний. Это позволит более точно оценивать качество и долговечность кабелей, которые мы используем каждый день.
Исходный код моего проекта будет представлен ниже, и я надеюсь, что он вдохновит других на создание собственных инновационных решений.
define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#define SERVO_MIN 1000 // Минимальная ширина импульса (1 мс)
#define SERVO_MAX 2000 // Максимальная ширина импульса (2 мс)
#define SERVO_MID ((SERVO_MIN + SERVO_MAX) / 2) // Среднее значение
volatile uint32_t rotation_count = 0; // Счетчик количества поворотов
void servo_init()
{
// Настройка таймера 1 для генерации ШИМ
TCCR1A |= (1 << WGM11) | (1 << COM1A1); // Fast PWM, 10-bit
TCCR1B |= (1 << WGM12) | (1 << WGM13) | (1 << CS11); // Prescaler 8
ICR1 = 20000; // TOP значение для 20 мс периода (50 Гц)
DDRB |= (1 << PINB5); // Установка PB5 (OC1A) как выход
}
void servo_set_position(uint16_t position)
{
OCR1A = position;
}
int main(void)
{
servo_init();
while (1)
{
// Поворот сервомотора на полный угол
servo_set_position(SERVO_MIN);
_delay_ms(700); // Задержка 700 мс
// Поворот сервомотора обратно
servo_set_position(SERVO_MAX);
_delay_ms(700); // Задержка 700 мс
// Увеличение счетчика поворотов после завершения полного цикла
rotation_count++;
}
return 0;
}