Pull to refresh

Как обновить ноутбук при помощи 3-d принтера

Level of difficultyEasy
Reading time7 min
Views21K

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

Знаете, многие люди ругают фирму Intel за то, что она каждые два года выпускает новый сокет, аргументируя это тем, что энергопотребление новых процессоров выросло столь значительно, что старый сокет просто не способен передать достаточную мощность на новый процессор. Но некоторые люди видят в этом запланированное устаревание для материнских плат, чтобы люди почаще покупали новые платы, а не сидели из года в год на одной и той же.

Так вот, ситуация с ноутбуками ещё более ужасна. Если у вас устарел ноутбук, то нельзя поменять процессор с материнской платой, надо выкинуть старый ноутбук и купить новый. И это ужас, ведь например у меня остался старый ноутбук, в котором работает матрица, клавиатура и SSD, и все это я получается должен выкинуть на свалку. Но благодаря тому, что у нас есть 3D принтер, мы можем разорвать этот ужасный порочный круг. Итак, давайте приступим.

Материнская плата.

На Aliexpress я приобрел материнскую плату для мини ПК. Вы можете возразить, что это просто плата mini-ITX. Но если присмотреться, то можно увидеть что на ней нет стандартного 24-х пинового разъема питания, она просто подключается к 12 вольтам. Также можно заметить что она использует планки sodimm которые используются в ноутбуках и мини ПК. Процессор здесь используется Intel Celeron N5095. Конечно можно сказать что обновление так себе. Но в моем acer aspire 1425p стоял Celeron SU2300 (1.2 ГГц, 2 ядра).

Монитор

Вот тут начинается самое интересное. Если у вас есть старый ноутбук, то вы можете достать из него матрицу. Но просто так она не заработает, поскольку подключается она к интерфейсу LVDS (low-voltage differential signaling), а нам нужен hdmi или на худой конец dvi. Но на том же Aliexpress продаются так называемые платы-скаллеры. Скаллеры могут быть как универсальные, в таких скаллерах разрешение выбирается перемычками, так и скаллеры предназначенные для определенного типа матрицы. Я например просто посмотрел какая матрица стоит в моем ноутбуке (Samsung LTN116AT01-A01) и по этому обозначению искал скалер. Ещё нужно обратить внимание на то, что не все скалеры поддерживают вывод звука. Лучше конечно покупать со звуком, а то вам придется самим городить усилитель и как-то подавать на него сигнал с компьютера.

Клавиатура

Клавиатуру тоже берем из ноутбука. Но проблема в том что контроллер клавиатуры располагается на плате ноутбука. То есть для клавиатуры понадобится контролер.

В качестве контроллера я буду использовать плату stm32 Blue Pill. Главное преимущество этой платы в том что, она имеет порт USB. Причем это не какой-то фиктивный порт (который на самом деле UART) как у Arduino, а самый настоящий полно скоростной, работающий на 48 мегагерцах.

Если вы не знаете как происходит управление клавиатурой то гуглите "матричная клавиатура".

Прошивку я делал по вот этому уроку. Я не буду повторять здесь то что там написано, только скажу что когда будете прошивать ваш Blue Pill, обязательно ставьте перемычки в положение 0, а то при прошивке у вас будут ошибки, и вы не будете понимать что происходит.

В репозитории в конце статьи вы найдете мои исходники, этот проект я компилировал в Platformio а заготовку для проекта я создавал в программе Stm32CubeMX. Когда вы будете создавать проект то CubeMX будет ругаться на отсутствующие библиотеки, но это нормально потому что все библиотеки подтянет Platformio поэтому можно просто игнорировать эти ошибки.

Если вы просто захотите откомпилировать мой проект в Platformio у вас ничего не получится потому что по умолчанию в файле usbd_hid.c наше устройство обозначено как мышь а нам нужна клавиатура. Поэтому вам все равно придется перейти на этот урок и посмотреть как заменить устройство на клавиатуру. Ссылки на файлы Stm32CubeMX, драйвер StLink, а также файл с описанием клавиатуры будут приложены в конце статьи. Также в репозитории лежит электрическая схема сделанная в программе Proteus.

Мультимедиа клавиатура

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

Проштудировав мануал по кодам USB клавиатуры я нашел в нем опкоды 128 и 129 (увеличить и уменьшить громкость), но к сожалению Windows на них никак не реагирует.

Порывшись в интернете я нашел пример в котором реализована мультимедиа клавиатура вот тут. Итак как-же её реализовать?

Для начала был изменен протокол обмена между устройством и компьютером в файле usb_hid.c.

Был таким:

char ReportDescriptor[HID_MOUSE_REPORT_DESC_SIZE] = {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x08,                    //   REPORT_COUNT (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
    0x95, 0x05,                    //   REPORT_COUNT (5)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x05, 0x08,                    //   USAGE_PAGE (LEDs)
    0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)
    0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x03,                    //   REPORT_SIZE (3)
    0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)
    0x95, 0x06,                    //   REPORT_COUNT (6)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x65,                    //   LOGICAL_MAXIMUM (101)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    0xc0                           // END_COLLECTION
};

Стал таким:

char ReportDescriptor[HID_MOUSE_REPORT_DESC_SIZE] = {
//hid report descriptor for interface 1 (keyboard)
      0x05, 0x01, //usage page (generic desktop)   //52, 53
      0x09, 0x06, //usage (keyboard)   //54, 55
      0xA1, 0x01, //collection (application) //56, 57
      0x85, 0x01, /* Report ID1  */
      0x05, 0x07, //usage page (key codes)   //58, 59
      0x19, 0xE0, //usage min (224) //60, 61
      0x29, 0xE7, //usage max (231) //62, 63
      0x15, 0x00, //logical min (0) //64, 65
      0x25, 0x01, //logical max (1) //66, 67
      0x75, 0x01, //report size (1) //68, 69
      0x95, 0x08, //report count (8)   //70, 71
      0x81, 0x02, //input (data, variable, absolute) [modifier byte] //72, 73
      0x95, 0x01, //report count (1)   //74, 75
      0x75, 0x08, //report size (8)    //76, 77
      0x81, 0x01, //input (constant) [reserved byte]  //78, 79
      0x95, 0x05, //report count (5)   //80, 81
      0x75, 0x01, //report size (1)    //82, 83
      0x05, 0x08, //usage page (page# for leds) //84, 85
      0x19, 0x01, //usage min (1)   //86, 87
      0x29, 0x05, //usage max (5)   //88, 89
      0x91, 0x02, //output (data, var, abs) [led report] //90, 91
      0x95, 0x01, //report count (1)   //92, 93
      0x75, 0x03, //report size (3) //94, 95
      0x91, 0x01, //output (constant) [led report padding]  //96, 97
      0x95, 0x05, //report count (5)   //98, 99
      0x75, 0x08, //report size (8) //100, 101
      0x15, 0x00, //logical min (0) //102, 103
      0x25, 0x65, //logical max (101)  //104, 105
      0x05, 0x07, //usage page (key codes)   //106, 107
      0x19, 0x00, //usage min (0)   //108, 109
      0x29, 0x65, //usage max (101) //110, 111
      0x81, 0x00, //input (data, array)   //112, 113
      0xC0,        //end collection  //114
      
      //MEDIA KEYBOARD
      0x05, 0x0C,    /*      Usage Page (Consumer Devices)      */
      0x09, 0x01,    /*      Usage (Consumer Control)         */
      0xA1, 0x01,    /*      Collection (Application)         */
      0x85, 0x02,    /* Report ID2  */                 
      0x05, 0x0C,    /*      Usage Page (Consumer Devices)      */
      0x15, 0x00,    /*      Logical Minimum (0)               */
      0x25, 0x01,    /*      Logical Maximum (1)               */
      0x75, 0x01,    /*      Report Size (1)                  */
      0x95, 0x07,    /*      Report Count (7)               */
      0x09, 0xB5,    /*      Usage (Scan Next Track)            */
      0x09, 0xB6,    /*      Usage (Scan Previous Track)         */
      0x09, 0xB7,    /*      Usage (Stop)                  */
      0x09, 0xCD,    /*      Usage (Play / Pause)            */
      0x09, 0xE2,    /*      Usage (Mute)                  */
      0x09, 0xE9,    /*      Usage (Volume Up)               */
      0x09, 0xEA,    /*      Usage (Volume Down)               */
      0x81, 0x02,    /*      Input (Data, Variable, Absolute)   */
      0x95, 0x01,    /*      Report Count (1)               */
      0x81, 0x01,    /*      Input (Constant)               */
      0xC0          /*      End Collection                  */ 
        };

Не забудьте в файле usbd_hid.h поправить параметр HID_MOUSE_REPORT_DESC_SIZE с 63 на 104.

#define HID_MOUSE_REPORT_DESC_SIZE    104U

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

typedef struct 
{
	uint8_t ID;
 	uint8_t MODIFIER;
	uint8_t RESERVED;
	uint8_t KEYCODE1;
	uint8_t KEYCODE2;
	uint8_t KEYCODE3;
	uint8_t KEYCODE4;
	uint8_t KEYCODE5;
} keyboardReportDes;

Вторая структура состоит из двух байтов это опять ID пакета и битовое поле медиа возможностей.

typedef struct 
{
	uint8_t ID;
 	uint8_t MEDIA;
} keyboardMediaDes;

Вот за что отвечает каждый бит:

  1. Трек вперед.

  2. Трек назад.

  3. Стоп.

  4. Плей/Пауза.

  5. Приглушить звук.

  6. Увеличить громкость.

  7. Уменьшить громкость.

Восьмой бит ни за что не отвечает.

Так-же опытным путем было установлено что если отправлять пакеты на компьютер чаще чем раз в 50 миллисекунд, то они просто теряются. Поэтому делать супер быструю клавиатуру не имеет смысла.

Звук

А вот динамики со старого ноутбука я брать не буду. Во первых, у них совершенно нет низких частот. То есть слушая музыку вы услышите виолончель но совершенно не услышите контрабас. Кроме того, звук который они создают довольно тихий. У меня часто бывала ситуация когда смотришь фильм, взрывы и выстрелы слышны хорошо а вот речь слышно неразборчиво, и хочется сделать погромче, а погромче сделать нельзя - это уже максимум . Поэтому я купил динамики AIYIMA.

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

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

Корпус

Корпус я напечатал на 3D-принтере. (Вот статья о моем 3D-принтере если вы не читали, то очень рекомендую). В чем-то его конструкция может показаться странной, но нужно учитывать, что мой 3D-принтер может печатать детали не более 230x150мм, поэтому какие-то детали мне пришлось делить на две части, а какие-то на три.

В конце статьи будет ссылка на репозиторий с 3D-моделью, она выполнена в программе Creo parametric (бывший ProEngineer).Также в репозитории есть PDF файл с 3D-моделью, но GitHub не может просматривать 3D содержимое, поэтому чтобы её посмотреть нужно скачать файл и просматривать его через Acrobat reader.

Обзор конструкции.

Ну и небольшая фотогалерея:

В собранном состоянии мой ноутбук представляет из себя прямоугольный параллелепипед размером 280x245x65мм, который можно легко и непринужденно переносить в сумке средних размеров.

Внутри основной части присутствует SSD и контроллер клавиатуры.

Внутри части с монитором установлен блок питания 12В 6А и скалер. Поскольку я не предполагаю использовать его в дороге, то мне не нужен аккумулятор. Мне нужен просто компактный компьютер который можно отвезти на дачу и там использовать.

Можно заметить что к скалеру припаяны провода. Дело в том, что колодки скалера имеют шаг 2мм. И, поскольку у меня нет таких разъемов, мне пришлось вместо них просто припаять провода.

Вывод

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

Ссылки:

Мой репозиторий

Stm32CubeMX

ST-LINK driver

KeyBoard Resources

Tags:
Hubs:
Total votes 68: ↑66 and ↓2+84
Comments58

Articles