Урок по созданию ноутбука на Raspberry Pi и Arduino

Ноутбук на Raspberry Pi и Arduino

После первого знакомства с «малиной» (Raspberry Pi) и ряда экспериментов у нас возникла идея собрать на её базе ноутбук. Когда вышла Raspberry Pi 3, мы наконец приступили к реализации этого проекта.

Шаг 1: Что мы хотим делать?

Перед тем как подбирать и закупать детали, следует решить, какой функциональностью должен обладать наш ноутбук. Например, мы хотим получить:

  • встроенная мышь (трекпад)

  • длительное время автономной работы

  • не менее 2 USB-портов

  • полная клавиатура

  • встроенный зарядник для аккумулятора Arduino

  • интегрированный Arduino с разъемами для подключения компонентов

  • малый форм-фактор

Ноутбук на Raspberry Pi - вид 1 Ноутбук на Raspberry Pi - вид 2 Ноутбук на Raspberry Pi - вид 3

Так как применяется Pi 3, покупать отдельный Wi-Fi или Bluetooth-адаптер (донгл) не требуется — всё уже встроено. Приведённый перечень далеко не полный; вариантов усовершенствования ноутбука существует множество.

При этом те функции, которые мы реализовали, значительно повышают удобство работы. К примеру, встроенный зарядник на базе Arduino оснащён компактным OLED-экраном рядом с основным дисплеем, где непрерывно показываются процент заряда и напряжение аккумулятора.

Отдельная деталь, которой мы особенно гордимся, — интегрированный Arduino с выведенными наружу разъёмами. В корпусе проделаны небольшие отверстия для доступа к контактным штырькам и подключения компонентов, так что Arduino фактически встроен в ноутбук.

Шаг 2: Детали для проекта

Детали для проекта - вид 1 Детали для проекта - вид 2 Детали для проекта - вид 3 Детали для проекта - вид 4

Для сборки проекта понадобится довольно много компонентов:

  • 1 x Raspberry Pi 3

  • 2 x Arduino Micro

  • 1 x Семи дюймовый 7» Raspberry PI экран

  • 3 x Литиевые батареи 18650

  • 1 x Цепь Powerbank

  • 1 x USB хаб

  • 1 x Мини USB клавиатура

  • 1 x USB разъем

  • 1 x Модуль-экран SPI OLED

  • Армированный картон

Кроме того, понадобится трекпад, который мы планируем изготовить самостоятельно в одном из будущих проектов, а пока его можно купить отдельно. Ещё раз отметим: данный перечень не окончательный.

Радует то, что большая часть деталей не зависит друг от друга, а значит, любую из них можно при желании заменить.

Компонентов для настройки достаточно много, поэтому для удобства мы сконфигурируем каждый по отдельности, а потом объединим всё вместе.

Шаг 3: Настройка «малины» и экрана

Настройка Raspberry Pi и экрана - вид 1 Настройка Raspberry Pi и экрана - вид 2

Начнём с Raspberry PI и дисплея. Экран подключается к Pi не через HDMI-порт, а с помощью 50-контактного ленточного кабеля, вставляемого в GPIO-разъём.

Однако просто подключить и включить Pi недостаточно — нужно изменить несколько строк в конфигурационном файле загрузки.

Первым делом скачиваем свежий образ Raspbian, который доступен по этой ссылке, и записываем его на SD-карту с помощью 7Zip (или другой подходящей утилиты). Затем на SD-карте необходимо открыть файл config.txt и вставить код, приведённый ниже. Он заставляет Pi при загрузке передавать видеоданные через GPIO-заголовки, а не через HDMI-порт (используемый по умолчанию).

Сделать это несложно. Откройте файл config.txt обычным блокнотом Windows (мы пользуемся notepad++) и вставьте код. Сохраните файл и закройте его — после установки SD-карты в Pi экран должен заработать. Если картинка слишком яркая или тусклая, подкрутите небольшой потенциометр на плате управления дисплеем.

Код:

dtoverlay=dpi24
enable_dpi_lcd=1
display_default_lcd=1
dpi_group=2
dpi_mode=87
dpi_output_format=0x6f005
hdmi_cvt 1024 600 60 6 0 0 0

Кроме того, Raspberry Pi потребуется небольшая физическая модификация для размещения внутри корпуса ноутбука. Нужно отпаять один из сдвоенных USB-портов.

Для этого наносим обильный слой припоя на контакты USB-разъёма и осторожно снимаем его, пока он не отделится.

Это нужно для того, чтобы припаять USB-хаб напрямую к Pi и подключить через него все устройства ввода.

Шаг 4: Настройка аккумулятора

Настройка аккумулятора - вид 1 Настройка аккумулятора - вид 2 Настройка аккумулятора - вид 3

Питание обеспечивают 3 аккумулятора 18650 ёмкостью 2400 мА/ч каждый. При параллельном соединении общая ёмкость достигает 7200 мАч.

Raspberry Pi вместе со всеми подключёнными компонентами потребляет порядка 1 ампера, поэтому трёх аккумуляторов хватает примерно на 4,5–5 часов автономной работы «малины». Если нужно увеличить время работы, можно добавить дополнительные батареи.

Перед этим каждый из 3 элементов следует зарядить до 4,2 вольта отдельно, поскольку параллельное соединение литиевых элементов с различным уровнем заряда (разным напряжением) очень опасно. Проще всего обезопасить себя — зарядить все элементы до конца перед их объединением.

Чтобы подключить батареи параллельно, соединяем все положительные клеммы вместе и все отрицательные клеммы вместе.

Применяйте провод крупного сечения, поскольку между батареями способны протекать большие токи, которые могут перегреть тонкий провод. Далее подключите положительный и отрицательный выводы батарей к соответствующим входным клеммам платы питания.

Вместо готового модуля повышающего преобразователя, аналогичного применённому здесь, можно использовать литиевое зарядное устройство для заряда элементов до 4,2 вольта и отдельный повышающий преобразователь для преобразования 4,2 вольта в 5 вольт. Впрочем, в итоге это делает то же самое, что и готовый модуль питания, но занимает больше пространства.

Шаг 5: Настройка дисплея батареи

Настройка дисплея батареи - вид 1 Настройка дисплея батареи - вид 2 Настройка дисплея батареи - вид 3

Данный шаг необязателен, ведь напряжение батареи можно считывать через GPIO Pi и выводить уровень заряда программным путём.

Тем не менее мы решили включить его, поскольку OLED-экран придаёт ноутбуку действительно эффектный внешний вид.

Для реализации нужно припаять OLED-дисплей к Arduino. Наш OLED-модуль — версия SPI, поэтому к Arduino подключаются 7 контактов.

Схема распиновки следующая:

OLED -> Arduino

  • Rest - Pin 7

  • DC - Pin 12

  • CS - Pin 9

  • DIN - Pin 11

  • CLK - Pin 13

  • VCC - 5 Volts (Вольт)

  • Ground - Ground (Земля)

Прежде чем загружать код, нужно собрать датчик напряжения, который соединит Arduino с аккумулятором и обеспечит считывание напряжения батарей.

Необходимо припаять 2 резистора по 10 Ом в виде делителя напряжения к контактам A0 и Ground (земля) на Arduino, после чего подключить их к аккумулятору: A0 — к плюсовой клемме, землю — к минусовой.

Помимо этого, для питания экрана следует припаять ещё один провод к земле и один — к VIN на Arduino; позже они будут подсоединены к плате питания.

После этого можно загрузить приведённый ниже код.

#include "U8glib.h"
int analogInput = 0;
int Percent ;  //We want it as a whole number
float Voltageout = 0.0;
float Voltage = 0.0; //We want it with decimal places
float R1 = 97000.0; //resistance
float R2 = 10000.0;  //resistance
int value = 0;

U8GLIB_SH1106_128X64 u8g(10, 9, 12, 11, 13); // pinout, see page

void draw(void)
{
  u8g.setFont(u8g_font_helvB14r); // font
  u8g.drawStr(19, 16, "BATTERY");
  u8g.setPrintPos(7,55);
  u8g.setFont(u8g_font_helvB18r);
  u8g.println(Percent);           //Prints Percent
  u8g.println("%");
  u8g.setPrintPos(63,55);
  u8g.setFont(u8g_font_helvB18r); //A slightly larger font
   u8g.println(Voltage);             //Prints the voltage
  u8g.println("V");
  u8g.drawRFrame(0, 23, 128, 1, 0);
}
void setup(){
   pinMode(analogInput, INPUT);
}
void loop(){
   value = analogRead(analogInput);
   Voltageout = (value * 5.0) / 1024.0;
   Voltage = Voltageout / (R2/(R1+R2));
   if (Voltage<1) {
   Voltage=0.0;  // get  rid of unwanted readings
   }
   if (Voltage>5.00) {  // if Reading are too large
    Voltage= Voltage/10;
   Percent = ((Voltage-3)/(4.2-3))*100; //votage divided by max cell votage times 100 = the cells current percentage
}
  u8g.firstPage();
  do
    {
     draw();
    }
  while( u8g.nextPage() );
delay(500);
}

Шаг 6: Настройка остальных частей

Настройка остальных частей - вид 1 Настройка остальных частей - вид 2

Основные компоненты подготовлены, осталось настроить более мелкие и простые элементы.

Начнём с клавиатуры: нужно извлечь её из заводского корпуса (рассчитанного на 7-дюймовый планшет). Для этого аккуратно обрезаем искусственную кожу по краям клавиатуры и достаём её вместе с рамкой. Внутри найдутся 4 провода, которые впоследствии припаяем к USB-хабу.

Для трекпада подготовка минимальна — достаточно взять микро-USB-кабель для подключения к USB-хабу. Что касается встроенного Arduino — к нему нужно припаять все контактные штырьки. Удобнее всего вставить штырьки и Arduino в макетную плату и паять в таком положении — так они встанут ровно. Далее берём ещё один микро-USB-кабель для подключения Arduino к USB-хабу. На этом подготовка всех компонентов завершена!

Шаг 7: Цепь (Подключение всего)

На данном этапе мы соединяем все компоненты воедино — связываем их между собой, формируя внутреннюю начинку ноутбука.

Первым делом подключаем USB-хаб к одному из двух USB-портов, распаянных ранее. От второго USB-порта длинными проводами ведём соединение к USB-разъёму «мама» на противоположной стороне корпуса. Затем к USB-хабу припаиваем трекпад, клавиатуру и Arduino. Далее 5-вольтовый выход модуля питания соединяется со входом питания Raspberry Pi посредством микро-USB-кабеля.

Переходим к дисплейной части — она состоит из двух компонентов: основного экрана и индикатора заряда батареи. Для основного экрана нужно лишь подключить 50-контактный ленточный кабель к дисплею и к соответствующему разъёму на Raspberry Pi.

Далее от Arduino индикатора батареи, о котором шла речь ранее, протягиваем 3 длинных провода. Провод от контакта A0 идёт к плюсовой клемме батареи, VIN — к 5-вольтовому выходу модуля питания, а земля — к общей земле.

Естественно, рано или поздно устройство потребуется выключить, поэтому между линией земли модуля питания и Raspberry Pi ставится переключатель, полностью обесточивающий систему.

Следует помнить, что резкое отключение питания Pi без корректного завершения работы нежелательно, поэтому лучшим вариантом будет настроить программное выключение через кнопку завершения работы в параметрах Raspberry Pi.

Шаг 8: Корпус ноутбука

Корпус ноутбука - вид 1 Корпус ноутбука - вид 2 Корпус ноутбука - вид 3

К сожалению, 3D-принтера в нашем распоряжении нет, однако достаточно прочный и опрятный корпус можно сделать из пластичного пластика и картона. Идея в том, что стенки корпуса вырезаются из картона, а внутри применяется пластичный пластик для закрепления компонентов и придания жёсткости конструкции.

Главное здесь — точно замерить и аккуратно вырезать картонные заготовки. Детали соединяются суперклеем, так как горячий клей оставляет заметные подтёки, ухудшающие внешний вид. Лучше сначала скрепить элементы суперклеем, потом усилить конструкцию клеем изнутри и дополнительно покрыть слоем пластичного пластика.

Шаг 9: Шарнир экрана

Шарнир экрана - вид 1 Шарнир экрана - вид 2 Шарнир экрана - вид 3

Удивительно, но именно этот этап оказался самым трудоёмким, хотя внешне он кажется простым. Необходимо изготовить очень жёсткий шарнир, а это легче сказать, чем сделать. Хорошей отправной точкой для поиска послужат старые ноутбуки или мониторы — подходящие шарниры часто попадаются в магазинах подержанной техники.

Когда шарниры найдены, вырежьте углубления в нижней части экрана и в верхней части основания, после чего заполните их пластичным пластиком, упомянутым ранее. Пока материал тёплый и пластичный, вдавите шарнир и зафиксируйте на месте. После застывания материал становится очень прочным, так что с шарниром проблем не будет.

Если допущена ошибка, разогрейте пластик феном, чтобы размягчить его и скорректировать или удалить.

Шаг 10: Что нужно посмотреть или улучшить

Итоговый результат ноутбука на Raspberry Pi

В процессе работы над проектом вы можете столкнуться с рядом трудностей, которые затруднят сборку или потребуют дополнительных расходов. Первая и самая неприятная — ленточный кабель. Он не рассчитан на частое подключение и отключение, но при тестировании нам приходилось делать это многократно, и в результате кабель вышел из строя (пришлось заказывать новый). Поэтому обращайтесь с ним максимально бережно.

Другая неприятность при тестировании ноутбука — загрузка кода не в тот Arduino! В основании устройства расположены 2 Arduino, подключённых к Raspberry Pi: первый отвечает за трекпад, а второй служит встроенным Arduino для проектов.

Неполадки возникали, когда скетч по ошибке заливался в Arduino трекпада, а не во встроенный. Ничего не будет функционировать правильно, пока код не окажется в нужном Arduino.

Несмотря на всё перечисленное, проект нельзя назвать слишком сложным, так как объём кода невелик. За это стоит поблагодарить создателей Raspberry Pi, которые сделали процесс разработки устройств и работы с микроконтроллером предельно простым.

Шаг 11: Итоговый результат

Сейчас ноутбук полностью функционирует, и мы используем его почти каждый день для записи заметок. Для этой задачи он подходит отлично, поскольку Raspbian OS (операционная система) уже включает LibreOffice, что делает его вполне подходящим для учёбы или работы.

Устройство поддерживает Wi-Fi и Bluetooth, поэтому просмотр YouTube и других веб-сайтов не составляет проблем. На нём запускается множество игр — от Minecraft до классических ретро-игр. Дополнительный плюс — длительное время работы от батареи.

В целом проект получился весьма увлекательным, и мы советуем попробовать собрать такой ноутбук самостоятельно.