Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
В этом проекте вы будете делать ночник, используя ardruino, Adafruit neo rgb Strips и 3D-принтер.
Обратите внимание, что эта инструкция предназначена исключительно для моего школьного проекта. Код этого проекта основан на другом проекте. С учетом сказанного, я не эксперт, когда дело доходит до Ардруино.
Шаг 1. Требования
Для этого проекта вам понадобится следующее оборудование и инструменты
Аппаратное обеспечение:
1 - Ardruino101 (в США) или Genuino101 (за пределами США).
2 - Светодиодные ленты NeoPixel rgb от adafruit (5 вольт).
3 - Разъем ardruino usb (разъем типа B - A).
4 - Программное обеспечение от Ardruino, Ardruino IDE. В этом руководстве мы будем использовать версию 1.8.5. Требования к программным библиотекам: 101, Adafruit NeoPixel и Madgwick.
5 -И объект для размещения вашего оборудования. В этом случае я буду использовать 3D-принтер. Файл для этого 3D-принта находится в описании под названием «Головка лампы». Обратите внимание, что этот формат файла не готов для 3D-печати. В зависимости от ваших 3D-принтеров вы должны сначала запустить указанное программное обеспечение для 3D-печати на 3D-объекте. Иногда масштаб 3D-печати сбрасывается. поэтому убедитесь, что установлен диаметр 11 см на 11 см.
6 - Базовый комплект для пайки.
Шаг 2: понимание оборудования и программного обеспечения
Ardruin / Genuino101
Чтобы прояснить, Ardruino101 и genuino101 точно такие же, как и имена. Оба имеют одинаковые характеристики и используют одно и то же программное обеспечение.
Ardruino101 обладает базовыми характеристиками, такими как ardruino UNO и другими. Главная особенность ardruino101 - акселерометр и гироскоп, которые мы будем использовать в нашем проекте. Также этот тип ardruino имеет уникальную библиотеку кодов под названием CurrieIMU (внутренние единицы измерения), которая включена в расширение библиотеки 101.
С учетом сказанного, давайте поговорим о программном обеспечении.
Программное обеспечение и библиотеки
Ardruino IDE использует python в качестве основного исходного кода. это также основная платформа кода, на которой работает большинство ardruino. В Интернете есть множество руководств по использованию этого программного обеспечения, поэтому я рекомендую вам сначала изучить их, если вы новичок в этой программе.
С учетом сказанного мы используем следующие библиотеки:
В меню "Скетч"> "Включить библиотеку"> "Управление библиотеками"… В текстовом поле введите
- 101 В стандартной версии ardruino 101 не включается автоматически в IDE ardruino. Нам нужно это расширение библиотеки, чтобы кодировать наш тип ardruino.
-Adafruit NeoPixel, чтобы кодировать наши пиксельные полосы Neo.
-Madgwick Для чтения необработанных данных и вычисления этих данных в необработанных, по тангажу и крену.
Neo RGB полоски
Тип, который я буду использовать, - это тип 5 напряжений или 5 В. С этим 5v мне не нужен расширенный источник питания для управления моими полосками. Вместо этого я буду использовать свой ardruino в качестве источника питания для управления и освещения полос.
Вот несколько советов, которые вам нужно знать, прежде чем приступить к работе с этими полосками.
Для начала вам понадобятся светодиодные ленты Neodigital RGB от adafruit. Этот вид полосок можно контролировать с помощью кодов. Следующее, что вам нужно знать, это то, что у этих полосок есть задняя и передняя стороны. Эта задняя и передняя сторона важны для пайки. Убедитесь, что вы припаяли лицевую сторону, где стрелка указывает от наконечника.
Вот руководство по их использованию.
Необходимо учитывать 3 точки пайки, заземление (GND), подключение напряжения (V) и контактное соединение (DIN).
Шаг 3: Настройка компонентов
Сначала вам нужно напечатать на 3D-принтере компонент, который вы можете найти в требованиях. В этом случае я буду использовать PLA. Убедитесь, что диаметр объекта составляет 11 см на 11 см. Это гарантирует, что ardruino и полоски поместятся в шпере. Обратите внимание, что каждый 3D-принтер использует разное программное обеспечение для расчета процесса печати. С учетом сказанного, файл, который вы используете, может масштабироваться по-разному, так что имейте это в виду.
Во-вторых, после печати убедитесь, что компоненты закрываются. 3D-отпечатки вместе составляют сферу. Они должны хорошо подходить. Если компонент должен потеряться, приклейте ленту на внутреннюю сторону, чтобы крышка была заполнена. А если он слишком толстый, используйте наждачную бумагу.
В-третьих, скематичи для ардруино и полос довольно просты. Вы будете использовать 3 провода для подключения полос к ardruino. Обратите внимание, что единственное место, где я припаял, - это полосы. не на самом Ардруино.
GND переходит в GND
DIN идет на вывод (в нашем случае pin6 на ardruino)
5 В переходит в 5 В
Убедитесь, что количество светодиодных полосок, которые вы используете, не превышает 30. Еще больше, и он не сможет правильно выполнить код. Вы можете просто отрезать ненужные полосы, отмеченные знаком ножниц.
Четвертый Evrything должен хорошо вписаться в сферу. Вам может понравиться, что я сделал пересечение между одним из 3D-принтов, чтобы видеть желоб, и поместил пластиковый желоб наверху.
Шаг 4: кодирование
Итак, к настоящему времени у вас должны быть все компоненты, необходимые в вашей библиотеке.
Вот код, который вам понадобится для запуска проекта. Результат должен выглядеть как ссылка на видео, которую я отправляю на этой странице.
Исходный код этого кода можно найти здесь. Этот проект также включает в себя необязательные шаги, чтобы лучше понять код и алгоритм его использования.
#include #include #include #include
#define PIN 6 // Полоса NeoPixel, 11 пикселей
#define PIN1 7 // Полоса NeoPixel в 1 пиксель #define NUMPIXELS 30 // Количество пикселей #define SAMPLE_RATE 25 // Частота дискретизации для акселерометра и гироскопа
// Конфигурация Madgwick
Фильтр Мэджвика; unsigned long microsPerReading, microsPrevious; float AccelScale, gyroScale;
// Конфигурация NeoPixel
Adafruit_NeoPixel пикселей = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixelsStatus = Adafruit_NeoPixel (1, 7, NEO_GRB + NEO_KHZ800);
// Цветовые пространства
RGBConverter rgbConverter; двойной h = 1; двойной s = 1; двойной v = 1; байт rgb [3];
// Индикатор состояния движения
// Состояние 0 -> Выбрать оттенок - Шаг // Состояние 1 -> Выбрать насыщенность - Крен // Состояние 2 -> Выбрать значение - Рыскание // Состояние 3 -> Исправить изменчивый цвет int statusLamp = 0;
void setup () {
Serial.begin (9600);
// запускаем IMU и фильтруем
CurieIMU.begin (); CurieIMU.setGyroRate (SAMPLE_RATE); CurieIMU.setAccelerometerRate (SAMPLE_RATE); filter.begin (SAMPLE_RATE);
// Устанавливаем диапазон акселерометра на 2G
CurieIMU.setAccelerometerRange (2); // Устанавливаем диапазон гироскопа на 250 градусов / секунду CurieIMU.setGyroRange (250);
CurieIMU.autoCalibrateAccelerometerOffset (X_AXIS, 0);
CurieIMU.autoCalibrateAccelerometerOffset (Y_AXIS, 0); CurieIMU.autoCalibrateAccelerometerOffset (Z_AXIS, 1); CurieIMU.autoCalibrateGyroOffset ();
CurieIMU.attachInterrupt (eventCallback);
CurieIMU.setDetectionThreshold (CURIE_IMU_TAP, 950); CurieIMU.interrupts (CURIE_IMU_TAP);
// инициализируем переменные для ускорения обновлений до правильной скорости
microsPerReading = 1000000 / SAMPLE_RATE; microsPrevious = micros ();
// Запуск NeoPixel 11
pixel.begin (); pixel.show ();
// Запускаем NeoPixel 1
PixelStatus.begin (); pixel.show ();
// Показываем статус в пикселях
setStatusPixel (statusLamp); }
void loop () {
int aix, aiy, aiz; // акселерометр int gix, giy, giz; поплавок топор, ау, аз; float gx, gy, gz; плавающий крен, тангаж, рыскание; static unsigned long microsNow;
// проверяем, пора ли читать данные и обновлять фильтр
MicrosNow = Micros (); if (microsNow - microsPrevious> = microsPerReading) {
// считываем необработанные данные из CurieIMU
CurieIMU.readMotionSensor (aix, aiy, aiz, gix, giy, giz);
// преобразование исходных данных в единицы измерения силы тяжести и градусы / секунды
ax = convertRawAcceleration (aix); ау = convertRawAcceleration (айы); аз = convertRawAcceleration (aiz); gx = convertRawGyro (gix); gy = convertRawGyro (giy); gz = convertRawGyro (giz);
// обновляем фильтр, вычисляющий ориентацию
filter.updateIMU (gx, gy, gz, ax, ay, az);
// выводим заголовок, шаг и крен
roll = filter.getRoll (); pitch = filter.getPitch (); yaw = filter.getYaw ();
// увеличиваем предыдущее время, поэтому мы сохраняем правильный темп
microsPrevious = microsPrevious + microsPerReading;
// Только если изменить оттенок, насыщенность или значение
if (statusLamp select Hue if (pitch> = -90 && pitch <= 90 && statusLamp == 0) {// Угол преобразования pitch = pitch + 90; // Получает координаты цвета из углов h = pitch / 180.0;}
// Угловые ограничения
// вращение только от -90º до 90º = 180º // Состояние 1 -> выберите Saturation if (roll> = -90 && roll <= 90 && statusLamp == 1) {// Угол преобразования roll = roll + 90; // Получает координаты цвета с углов s = roll / 180.0; }
// Состояние 2 -> выберите значение
if (statusLamp == 2) {// рыскание от 0º до 360º v = yaw / 360.0; }
// преобразовать в rgb
rgbConverter.hsvToRgb (h, s, v, rgb); / * Serial.print ("Цвет:"); Серийный отпечаток (ч); Serial.print ("-"); Серийный. Отпечаток (ы); Serial.print ("-"); Serial.print (v); Serial.println ("");
Serial.print ("Ориентация:");
Serial.print (рыскание); Serial.print (""); Serial.print (шаг); Serial.print (""); Serial.println (рулон); * /
// Меняем цвет пикселей
for (int px = 0; px <NUMPIXELS; px ++) {пикселей.setPixelColor (px, pixels. Color (rgb [0], rgb [1], rgb [2])); pixel.show (); }}
// Показываем статус в пикселях
setStatusPixel (statusLamp); }}
float convertRawAcceleration (int aRaw) {
// поскольку мы используем диапазон 2G // -2g сопоставляется с исходным значением -32768 // + 2g сопоставляется с исходным значением 32767
float a = (aRaw * 2.0) / 32768.0;
вернуть; }
float convertRawGyro (int gRaw) {
// поскольку мы используем диапазон 250 градусов / секунд // -250 сопоставляется с исходным значением -32768 // +250 сопоставляется с исходным значением 32767
float g = (gRaw * 250.0) / 32768.0;
return g; }
static void eventCallback ()
{// Обнаружение касания по всей оси if (CurieIMU.getInterruptStatus (CURIE_IMU_TAP)) {Serial.print ("Обнаружено касание statusLamp:"); Serial.println (statusLamp);
// Изменить состояние
statusLamp ++;
// Состояние инициализации
если (statusLamp> 3) {statusLamp = 0; }}}
void setStatusPixel (int statusPx)
{переключатель (statusPx) {case 0: pixelsStatus.setPixelColor (0, pixelsStatus. Color (150, 0, 0)); PixelStatus.show (); перерыв; случай 1: PixelStatus.setPixelColor (0, PixelStatus. Color (0, 150, 0)); PixelStatus.show (); перерыв; случай 2: PixelStatus.setPixelColor (0, PixelStatus. Color (0, 0, 150)); PixelStatus.show (); перерыв; случай 3: PixelStatus.setPixelColor (0, PixelStatus. Color (0, 0, 0)); PixelStatus.show (); перерыв;
}
}