Сообщество - TECHNO BROTHER

TECHNO BROTHER

2 083 поста 13 661 подписчик

Популярные теги в сообществе:

993
TECHNO BROTHER

Я купил игровую консоль и написал для неё BIOS2

Осторожно: Статья написана максимально простым языком. Так что если вы гик, но не умеете программировать - вам всё равно будет интересно!

Недавно я наткнулся на DIY-игровую консоль за 1.500 рублей - Waveshare GamePi13. Когда гаджет приехал ко мне, я запустил примеры игр от производителя... и оторопел от 5 FPS в Pong - это ж как плохо нужно код писать!

Не желая мириться с этим, я открыл схему устройства, даташит на RP2040 и принялся писать свой собственный BIOS. Если вам интересно узнать, как работают DIY-консоли «изнутри», можно ли запускать внешние программы на микроконтроллерах из RAM, как реализованы различные подсистемы BIOS, а в конце даже написать «Змейку» - добро пожаловать под кат!

❯ Предисловие

Иногда китайские производители выпускают на рынок дешевые гаджеты с ориентиром исключительно на гиков. Чего-уж говорить, с какой-нибудь R36s чего только не сделали: и кастомные прошивки, и порты игр с ПК, и даже достаточно сложные аппаратные модификации. Однако в тусовке DIY'щиков обычно всё куда хардкорнее...

«Андерграундные» консоли выходят чуть ли не каждый день, но лишь единицы из них становятся хоть сколь либо популярными и попадают на массовый конвейер. От «больших» консолей их отличает простая схемотехника, использование распространенных и дешевых микроконтроллеров общего назначения и полная свобода творчества — что хочешь, то и твори! По характеристикам они чаще всего близки к оригинальному GameBoy или GameBoy Advance, а покупают их инженеры, демосценеры и ретро-энтузиасты, которые не только играют во что-то готовое, но и пишут небольшие игрушки сами!

Самые известные консоли такого формата — это нашумевший Playdate и чуть менее известный Arduboy. Обе консоли сильно ограничены в характеристиках и это подстегивает интерес гиков к постоянной оптимизации кода и попыткам впихнуть «невпихуемое». Выделился даже российский «Микрон», представив свою DIY-консоль «для хардкорных ардуинщиков» — некий MikBoy на базе своего же МИК32 «Амур»!

Я уверен что Микроновцы будут читать эту статью... Если вдруг всё получится и MikBoy пойдёт в серию — то напишите мне пожалуйста сообщение :)

Я уверен что Микроновцы будут читать эту статью... Если вдруг всё получится и MikBoy пойдёт в серию — то напишите мне пожалуйста сообщение :)

Подобным «ардуинщиком» являюсь и я. Ещё со школьных лет меня нереально тянет к микроконтроллерам и Embedded-электронике в целом. О консоли собственной разработки я мечтаю с 14 лет, при этом мне не просто хочется собрать прототип и «забить», но и запустить мелкосерийное ручное производство и продавать устройства подписчикам! К своим 24-годам я сделал два прототипа и развел три платы, но все эти проекты так или иначе откладывались в долгий ящик...

Один из ранних-ранних прототипов, предназначенный для обкатки драйвера дисплея.

Один из ранних-ранних прототипов, предназначенный для обкатки драйвера дисплея.

И вот, 25 сентября мне стукнуло 24 годика. Уже взрослый мальчик получил в качестве подарка донат от постоянного читателя и пошёл изучать маркетплейсы в поисках интересного железа. По ключевым словам «tft lcd diy» был найден «ESP32 Bitcoin Miner V2» (выгодный девкит с 2.8" и ESP32-S2), девкит ESP32 с 4.3" дисплеем и емкостным тачскрином, а также некий Waveshare GamePi13, о котором мы сегодня с вами и поговорим!

Отдельное спасибо хотелось бы сказать тем самым подписчикам. Без вашей поддержки этой статьи бы не было!

Waveshare — знаменитый в кругах энтузиастов SBC производитель. В основном компания занимается дисплеями, модулями расширения и одноплатными компьютерами.

Waveshare — знаменитый в кругах энтузиастов SBC производитель. В основном компания занимается дисплеями, модулями расширения и одноплатными компьютерами.

В тот же день я заказал устройство, и уже через 3 недели трепетного ожидания, GamePi13 оказался у меня на столе. На первый взгляд консоль показалась очень маленькой: её 1.3" дисплей был даже меньше, чем у Nokia 6230i, а кнопки оказались расположены непривычно близко друг к другу. Ко всему прочему, у консоли не было предусмотрено вообще никакого корпуса: ни «болванки» от производителя, ни STL-файлов для печати. Что-ж, это только придаёт брутальности нашему устройству!

Оба устройства помещаются в одну ладошку... А ведь когда-то 6230i казался реально большим!

Оба устройства помещаются в одну ладошку... А ведь когда-то 6230i казался реально большим!

Как вы уже могли заметить, консоль состоит из двух независимых модулей: платы разработки Waveshare RP2040-PiZero и «бутербродного» геймпада с дисплеем, который подключается к гребёнке основной платы. В этом и кроется главный секрет устройства: геймпад изначально рассчитан именно для «одноплатников» Raspberry Pi, но поскольку Waveshare также выпускает плату RP2040 с Pi-совместимой гребёнкой, они решили заодно адаптировать его и для PiZero.

❯ Что внутри?

Хоть PiZero и похожа на референсную плату в лице Raspberry Pi Pico, у неё есть несколько серьёзных отличий:

  • Во первых, на плате установлена SPI-флэшка объёмом аж в 16МБ. Это максимальный объём, который поддерживает XIP-контроллер в RP2040. В RPi Pico же используется флэш-память объёмом всего в 2МБ.

  • Далее внимание привлекает использование менее эффективного ULDO RT9193 вместо полноценного DC-DC преобразователя в оригинальном Pico. Сам микроконтроллер сможет работать при разрядке аккумулятора ниже 3.6В, а вот периферия — под вопросом. Иными словами, мы не сможем использовать «все соки» из аккумулятора и нам придётся реализовывать отсечку по напряжению.

  • На плате распаяна микросхема-чарджер литий-ионных аккумуляторов ETA6096 с током зарядки аж в 1А. Если захотите использовать аккумулятор меньшей емкости — стоит подобрать резистор ISET большего номинала, иначе есть риск перегрева.

  • Из разъёмов распаян HDMI (да, я тоже в шоке), слот для MicroSD (под него отдали весь SPI0) и два Type-C: один для аппаратного USB-контроллера в RP2040, второй для USB через PIO. В общем, пытались угодить всем.

Плата с геймпадом не менее интересная. С фронтальной стороны у нас расположилось 10 кнопок и 1.3" IPS-дисплей с разрешением 240x240, использующий контроллер ST7789. Вообще, для такой диагонали разрешение дисплея крайне избыточно: оно не только съедает драгоценные килобайты оперативной памяти для фреймбуфера, но и значительно грузит DMA-контроллер и всю шину SPI. Я бы на месте инженеров установил бы сюда «золотой стандарт» — недорогой 1.8" 128x160. Все кнопки подключены к отдельным пинам без сдвигового регистра и занимают значительную часть доступных GPIO.

Я бы сделал лучше!

Я бы сделал лучше!

С обратной стороны расположился небольшой динамик, усилитель, построенный на базе NS8002, 3.5мм джек для подключения наушников, а также токоограничивающий резистор подсветки и обвязка для дисплея. Подсветка подключена напрямую к VSYS и рассчитана на питание от 3.3В, так что никакой регулировки яркости и продвинутых режимов сна!

Производитель платы — компания SpotPear.

Производитель платы — компания SpotPear.

Ну что-ж, собираем наш бутерброд обратно, подключаем Type-C и смотрим на одну из представленных демо-игр — Тетрис!

Нет, это не пережатая гифка, игра действительно идёт буквально в 1 FPS и с мерцанием — и это на микроконтроллере с ядром Cortex-M0+ на частоте аж в 150МГц! Я напомню, что N-Gage с процессором TI OMAP на более старом ядре ARM926EJ-S с частотой 104МГц умудрялся тянуть первый Tomb Raider с полностью программным рендерингом в 25 FPS!!!

Далее я решил открыть официальный вики Waveshare и изучить информацию о консоли, где нашел несколько примеров игр для неё, одной из которых был Pong. Какое же было моё разочарование, когда я узнал, что обе игры написаны полностью на Python: игровая логика, маршалинг данных, работа с «железом» — всё это было на интерпретируемом языке и более того, написано плохо и крайне неэффективно!

class hardware():
def init():
spi0=SPI(1,baudrate=900000000, phase=0, polarity=0,
sck=Pin(game_kit.lcd_sck, Pin.OUT),
mosi=Pin(game_kit.lcd_sda, Pin.OUT))
display = st7789.ST7789(spi0, 240, 240,
reset=Pin(game_kit.lcd_rst, Pin.OUT),
dc=Pin(game_kit.lcd_dc, Pin.OUT),cs=Pin(game_kit.lcd_cs, Pin.OUT),
xstart=0, ystart=0, rotation=0)
# 初始界面,提示游戏开始
display.fill(st7789.BLACK)
display.text(font2, "Pong!", 90, 90)
display.text(font2, "Let's go!", 60, 140)
time.sleep(1)

hardware.display = display


class pong():
def __init__(self):
# bgm
self.bgm = p_music(p_music.song2, tempo=1, duty=500, pins=[
Pin(game_kit.buzzer, Pin.OUT)])
# 控制音乐暂停和播放的键start
self.key_start = button(game_kit.key_start, self.key_start_callback)

# led
self.led = Pin(game_kit.led_sta, Pin.OUT)

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

Драйвер дисплея даже не пытается использовать DMA, из-за чего даже Понг, состоящий из трёх прямоугольников умудряется тормозить.

def blit_buffer(self, buffer, x, y, width, height):
"""
Copy buffer to display at the given location.

Args:
buffer (bytes): Data to copy to display
x (int): Top left corner x coordinate
Y (int): Top left corner y coordinate
width (int): Width
height (int): Height
"""
self.set_window(x, y, x + width - 1, y + height - 1)
self.write(None, buffer)

Звуковая подсистема, состоящая из одноканальной тональной пищалки на аппаратном ШИМ-контроллере, тоже была со своими «приколами». Например «тишина» — это 0, то есть магнит всегда прижат к нижней части, хотя должно быть PWM_MAX / 2.

Под впечатлением от такого кода, я решил попробовать написать SDK для этой консоли сам. Однако моё видение идеальной DIY-консоли сильно отличалось от того-же Arduboy или Playdate!

❯ Архитектура

При проработке архитектуры будущего «BIOS», я сразу же поставил для себя несколько чётких задач:

  • Во первых, BIOS должен быть достаточно абстрактным для того, чтобы скрывать от игры детали реализации конкретного «железа». Иными словами, игра оперирует не DMA-контроллерами, FPU-сопроцессором и SPI, а набором простых и понятных подсистем: графика, ввод, звук, хранилище. Кроме того, это позволяет легко портировать игры для такого BIOS'а на другие платформы: можно без проблем реализовать симулятор (не эмулятор!) консоли на ПК или портировать её на ESP32 с минимальными изменениями.

  • Во вторых, мы ставим производительность в основной приоритет при разработке устройства. В конце-концов это же позорище, что простейшая игра тормозит и мерцает на мощном микроконтроллере, но при этом тетрисы с трёхмерной графикой вполне шустро работали на телефонах Sony Ericsson 2005 года. Именно поэтому для написания игр используются не скриптовые языки по типу Lua или JS, а самый обычный «C с классами».

  • В третьих, сам BIOS должен быть легко портируем между разными платами (у SpotPear есть вторая похожая плата — уже с 1.5" и стиком) и даже аппаратными платформами. Этот проект может стать основной прошивкой для консоли уже моей разработки и иметь вот такую «кроссплатформу» было бы отнюдь не лишним!

Руководствуясь критериями выше, я решил писать BIOS на C++ (на деле C с классами) с активным использованием интерфейсов и VMT. Это позволяет не только удобно структурировать модули и повышает читаемость кода игры, но и избавляет от необходимости вручную составлять таблицу системных вызовов к API. Тем не менее, в таком подходе есть один серьёзный нюанс: когда у подсистем появляются новые методы или добавляются перегрузки к прошлым, их необходимо по порядку добавлять в конец интерфейса, иначе VMT ломается.

vtable for CTest:
.word 0
.word typeinfo for CTest
.word CTest::Test()
.word CTest::Abc()
vtable for ITest:
.word 0
.word typeinfo for ITest
.word __cxa_pure_virtual
.word __cxa_pure_virtual

В своё время Microsoft решила эту проблему в COM с помощью QueryInterface и миллиона вариаций этих самых интерфейсов: IDirectSound8, IDirectDraw7 и т.д, но мы можем не изобретать велосипед, а просто предоставлять «старым» играм такие же «старые» версии VMT.

Основным объектом в BIOS'е является CSystem, который содержит в себе ссылки на другие подсистемы консоли, а также на информацию о текущей аппаратной платформе:

/// @brief Primary system service, supplied to both games and system modules.
class ISystem
{
public:
virtual CSystemInfo* GetSystemInfo() = 0;

virtual void* Alloc(uint32_t size) = 0;
virtual void Free(void* ptr) = 0;

virtual IGraphicsService* GetGraphicsService() = 0;
virtual IInputService* GetInputService() = 0;
virtual IDebugService* GetDebugService() = 0;
};

Несмотря на кажущуюся «динамическую» натуру системы, никаких IID я переизобретать не стал. BIOS должен реализовывать ровно тот минимальный функционал системы, который нужен. Экземпляр CSystem создаётся так называемым «портом» на конкретную плату, который должен заполнить структуру с указателями на реализации подсистем — прямо как machine-файлы в Linux! И RAII не нарушили, и полный контроль без костылей сохранили — ляпота!

void InitializePlatform()
{
CommManager = new CCommunicationManager();
CDebugService* dbgSvc = new CDebugService();

/* Print some userful debug information */
CJEDECFlashID* flashId = FlashManager.GetFlashID();

dbgSvc->Print("Initializing platform");
dbgSvc->Print("Flash memory manufacturer: 0x%x, capacity: %dKb", flashId->Manufacturer, flashId->Capacity / 1024);
dbgSvc->Print("CID: %d", FlashManager.GetCID());
dbgSvc->Print("First available: %d", FlashManager.GetFirstUserSector());

/* Service initialization */
InputService = new CInputService(dbgSvc);
GraphicsService = new CGraphicsService(dbgSvc);

/* Platform description info */
PlatformInfo.DebugService = dbgSvc;
PlatformInfo.GraphicsService = GraphicsService;
PlatformInfo.InputService = InputService;

System = new CSystem(&PlatformInfo);
}

int main() {
InitializePlatform();

while (true) {
/* Tick all platform-depend services here */
CommManager->Tick();
PowerStateManager.Tick();
InputService->Tick();

System->Tick();
}
}

В целом, базовая архитектура примитивная и понятная. Перейдем же к деталям реализации конкретных модулей.

❯ Графика

Первая подсистема, которую я реализовал — была графической. Концептуально она разделена на два отдельных модуля: драйвер дисплея, который позволяет получить его параметры и в будущем управлять его состоянием, а также модуль для рисования на поверхностях. Прямо как в DirectDraw:

struct CFrameBufferInfo
{
uint16_t Width;
uint16_t Height;
CColor* Pointer;
uint32_t Size;
};

class IDrawingSurface : public ISystemService
{
public:
virtual void Clear(CColor color) = 0;
virtual void DrawBitmap(CBitmap* bitmap, int x, int y) = 0;
virtual void DrawBitmapEx(CBitmap* bitmap, int x, int y, CSpriteInfo* spriteInfo) = 0;
virtual void DrawRect(CColor color, int x, int y, int width, int height) = 0;
virtual void FillRect(CColor color, int x, int y, int width, int height) = 0;
virtual void DrawLine(CColor color, int x1, int y1, int x2, int y2) = 0;
virtual void DrawString(CColor color, int x, int y, CAnsiChar* str) = 0;
};

class IGraphicsService : public ISystemService
{
public:
virtual void SetPowerState(bool isPowerEnabled) = 0;
virtual void SetBacklightState(bool isBacklightEnabled) = 0;
/* Maybe some controller-related functions in future? Like BIAS and HW rotation? */

virtual CFrameBufferInfo* GetFrameBufferInfo() = 0;
virtual IDrawingSurface* GetDrawingSurface() = 0;
virtual void Flush() = 0;
};

Сам драйвер дисплея классический: в его задачи входит инициализация контроллера, выделение памяти под фреймбуфер и регулярное обновление изображения на матрице. Поскольку в таких устройствах используются стандартные MIPI DBI экраны с набором команд DCS, часть кода инициализации и работы с дисплеем стало возможным унифицировать:

/* Perform hardware reset */
gpio_put(PIN_LCD_RST, 0);
sleep_ms(DISPLAY_INIT_SLEEP_TIME);
gpio_put(PIN_LCD_RST, 1);
sleep_ms(DISPLAY_INIT_SLEEP_TIME); /* Wait for display controller to complete initialization */

Reset(); /* Perform software reset to maintain default register state */
SendCommand(cmdSLPOUT, 0, 0); /* Disable sleep mode */
SendCommand(cmdCOLMOD, 0x05); /* Set color format and decoding*/
SendCommand(cmdINVON, 0, 0); /* Disable inversion */
SendCommand(cmdNORON, 0, 0); /* Enable normal mode */
SendCommand(cmdMADCTL, cmdMADCTL_RGB); /* Set pixel size */

uint8_t windowSize[] = { 0 >> 8, 0, DISPLAY_WIDTH >> 8, DISPLAY_WIDTH }; /* Set display window (note this is not safe for displays with sides not equal in size) */
SendCommand(cmdCASET, windowSize, 4);
SendCommand(cmdRASET, windowSize, 4);

SetPowerState(true); /* Enable display */

Вероятно читатель может спросить: «зачем выделять целых 115КБ под фреймбуфер, если можно использовать команды CASET/RASET и рисовать отдельные спрайты прямо в память дисплея?». Дело в том, что в таком случае скорость отрисовки будет падать обратно пропорционально размеру и числу рисуемых изображений. Если мы попытаемся нарисовать параллакс-фон, состоящий из трёх картинок с размерами 240x240, то нашим узким местом станет не только цена обращения к XIP-кэшу, но и производительность SPI-контроллера (который напрямую тактируется от системного PLL) и мы получим те самые 1-2 FPS. Кроме того мы потеряем возможность использования DMA и нам придётся ждать каждой транзакции на экран: это проблема многих «самодельных» консолей, которую, впрочем, можно решить обратившись к опыту предков — а именно PPU.

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

/* Setup DMA for SPI */
dmaChannel = dma_claim_unused_channel(true);

dmaConfig = dma_channel_get_default_config(dmaChannel);
channel_config_set_transfer_data_size(&dmaConfig, DMA_SIZE_8);
channel_config_set_dreq(&dmaConfig, spi_get_dreq(spi1, true));
channel_config_set_read_increment(&dmaConfig, true);
channel_config_set_write_increment(&dmaConfig, false);

...

if(!dma_channel_is_busy(dmaChannel))
{
uint8_t cmdByte = cmdRAMWR;
gpio_put(PIN_LCD_CS, 0);
gpio_put(PIN_LCD_DC, 0);
spi_write_blocking(spi1, &cmdByte, 1);

gpio_put(PIN_LCD_DC, 1);
dma_channel_configure(dmaChannel, &dmaConfig, &spi_get_hw(spi1)->dr, frameBufferInfo.Pointer, frameBufferInfo.Size, true);
}

Далее переходим к фактической отрисовке изображений. На данный момент поддерживается только один формат пикселей — RGB565, поскольку нет особого смысла использовать 8-битную палитру для изображений 32x32 (но есть смысл использовать 4х-битную, как на NES). Процесс рисования называется блиттингом и поскольку реализация полноценного альфа-блендинга слишком дорогая для реалтайм графики на микроконтроллерах, для описания прозрачности используется техника колоркеев.

Взято с <a href="https://pikabu.ru/story/ya_kupil_igrovuyu_konsol_i_napisal_dlya_neyo_bios_13327291?u=https%3A%2F%2Fru.pinterest.com%2Fpin%2F663506957573347585%2F&t=pinterest&h=b409d0ad71297189d8f711597c010a1f143b8fba" title="https://ru.pinterest.com/pin/663506957573347585/" target="_blank" rel="nofollow noopener">pinterest</a>

Взято с pinterest

ColorKey — это как ChromaKey, но для описания прозрачного цвета используется только базовый цвет, а не цвет + порог допустимых цветов. Помните как в играх 90-х были картинки с розовым фоном цвета Magenta? Вот это оно самое :)

for(int i = 0; i < min(y + bitmap->Height, frameBufferInfo->Height) - y; i++)
{
CColor* bitmapScanline = &bitmap->Pointer[i * bitmap->Width];
CColor* scanline = &frameBufferInfo->Pointer[(y + i) * frameBufferInfo->Width + x];

for(int j = 0; j < min(x + bitmap->Width, frameBufferInfo->Width) - x; j++)
{
uint16_t sample = *bitmapScanline;

if(sample != bitmap->ColorKey)
*scanline = sample;

scanline++;
bitmapScanline++;
}
}

Рисование текста реализовано знакомым для Embedded-инженеров способом: шрифты описываются в формате 8x8, где 8 битов каждого байта обозначают наличие или отсутствие пикселя в текущей позиции. Такие шрифты не только занимают очень мало места, но их также очень легко и быстро рисовать, а также масштабировать под различные разрешения экранов. На данный момент я задумываюсь — стоит ли добавлять в консоль поддержку полноценного UTF-16, если учесть что основной таргет на русскоязычную аудиторию, где и CP866 хватает с головой?

Какой же дисплей чёткий...

Какой же дисплей чёткий...

❯ Ввод

Далее мы плавно переходим к реализации драйвера ввода. Как я уже говорил выше, все кнопки подключены к своим отдельным GPIO без использования сдвигового регистра или I/O Expander'а, что с одной стороны и хорошо (некоторые китайские производители реализовывают консоли с кнопками, основанными на матричном (!!!) принципе), а с другой — отъедает большинство GPIO у RP2040. Свободными пинами мы могли бы выполнять множество полезной работы: получать уровень заряда аккумулятора у Fuel Gauge, управлять уровнем подсветки с помощью ШИМ-контроллера и ключа, или, в конце-концов, сделать порт для подключения периферии... но нет так нет.

Сам по себе драйвер ввода до жути примитивный: он позволяет получить состояние отдельных кнопок, осей (как Input.GetAxis в Unity) и проверить, нажата ли хоть какая-то кнопка:

class IInputService : public ISystemService
{
public:
virtual EKeyState GetKeyState(EKeyCode keyCode) = 0;
virtual int GetAxis(EInputAxis axis) = 0;
virtual bool IsAnyKeyPressed() = 0;
};

Для удобства и портабельности BIOS'а между платами, кнопки геймпада маппятся к соответствующим GPIO в отдельной таблице трансляции, которая также содержит состояния этих самых кнопок:

// Should be layouted in order of EKeyCode enum
CButtonState ButtonMapping[] = {
{
PIN_KEY_LEFT
},
{
PIN_KEY_RIGHT
},
{
PIN_KEY_UP
},
{
PIN_KEY_DOWN
},
{
PIN_KEY_A
},
{
PIN_KEY_B
},
{
PIN_KEY_X
},
{
PIN_KEY_Y
},
{
PIN_KEY_LEFT_TRIGGER
},
{
PIN_KEY_RIGHT_TRIGGER
}
};

Дело в том, что в нашем проекте недостаточно иметь лишь одно булево: нажата-ли кнопка или нет, для компенсации дребезга кнопок у нас также реализуется задержка перед следующей проверкой и дополнительное состояние для удобства реализации меню — «только что отпущена».

void CInputService::Tick()
{
timeStamp = get_absolute_time();

for(int i = 0; i < ButtonMappingCount; i++)
{
CButtonState* buttonState = &ButtonMapping[i];
bool gpioState = !gpio_get(buttonState->GPIO); // Buttons are pull-up to high when not pressed

// Check if there was elapsed enough time
if(timeStamp > buttonState->LastStateChange)
{
if(buttonState->State == EKeyState::ksReleased)
buttonState->State = EKeyState::ksIdle;

if(buttonState->State == EKeyState::ksIdle && gpioState)
buttonState->State = EKeyState::ksPressed;

if(buttonState->State == EKeyState::ksPressed && !gpioState)
buttonState->State = EKeyState::ksReleased;

buttonState->LastStateChange = timeStamp + KEY_DEBOUNCE_THRESHOLD;
}
}
}

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

EKeyState CInputService::GetKeyState(EKeyCode keyCode)
{
uint32_t code = (uint32_t)keyCode;

if(keyCode >= ButtonMappingCount)
return EKeyState::ksIdle; /* Maybe we should throw an exception? */

return ButtonMapping[code].State;
}

int CInputService::GetAxis(EInputAxis axis)
{
EKeyCode a = EKeyCode::keyLeft;
EKeyCode b = EKeyCode::keyRight;

if(axis == EInputAxis::inputAxisVertical)
{
a = EKeyCode::keyUp;
b = EKeyCode::keyDown;
}

return GetKeyState(a) == EKeyState::ksPressed ? -1 : (GetKeyState(b) == EKeyState::ksPressed ? 1 : 0);
}

А вот и результат:

❯ Запуск программ

Вот мы и подошли к, возможно, самой интересной подсистеме в нашем BIOS'е. Думаю многие читатели так или иначе интересовались тем, как же компилятор и линкер превращают исходный код и объектный файлы в пригодные для выполнения программы и библиотеки. Вопрос запуска нативных программ на микроконтроллерах интересовал и меня — я даже написал целых три статьи об этом: в первой мы поговорили о ESP32 и Xtensa, а во второй реализовали BinLoader путём реверс-инжиниринга и хакинга кнопочного телефона, а в третьей сделали полу-универсальный ElfLoader для нескольких моделей телефонов на разных платформах.

Но начнём мы с простого. Каждая программа делится на три основных секции:

  • .text — содержит в себе машинный код функций и так называемые Literal pools. Может быть как в ROM, так и в RAM. На системах, где есть возможность выполнять код и в ROM, и в RAM, есть отдельная секция - .iram.

  • .data — содержит инициализированные переменные, которые обычно попадают в оперативную память. Для статических констант есть отдельная секция, называемая .rodata.

  • .bss — содержит в себе не-инициализированные переменные, обычно это нули. В исполняемый файл секция .bss напрямую не записывается, остаётся лишь информация о том, каков её размер, а саму секцию затем выделит динамический линкер.

Куда попадут части программы определяет специальная утилита — линкер, которая на основе специального скрипта «раскладывает» данные по нужным секциям. Благодаря этому скрипту, мы можем, например, перенести часть функций в оперативную память для более быстрого исполнения или добавить в начало программы заголовок с описанием приложения.

В моём случае, я решил загружать игры в SRAM и дабы не реализовывать нормальный динамический линкер и релокации, решил выделить под игру фиксированный кусочек оперативной памяти объёмом в 128КБ. Для этого я отредактировал скрипт линкера Pico C SDK так, чтобы сразу после вектора прерываний шла наша программа:

. = ALIGN(4);

.ram_vector_table (NOLOAD): {
*(.ram_vector_table)
} > RAM

iram_program_reserve_size = 128K;

.iram_program (NOLOAD) : {
. = ALIGN(4);
PROVIDE(iram_program_origin = .);
. += iram_program_reserve_size;
} > RAM

.uninitialized_data (NOLOAD): {
. = ALIGN(4);
*(.uninitialized_data*)
} > RAM

Для компиляции программы также используется кастомный скрипт для линкера и особый Makefile, где после сборки программы мы копируем все её секции в выходной файл в «сыром» виде. Поскольку программа собирается под выполнение из конкретного адреса — пока речь идёт о переносимости только между одной аппаратной платформой. На RP2040, RP2350 и возможно STM32 такое «прокатит», но вот на других ARM-процессорах — большой вопрос!

OUTPUT_FORMAT("elf32-littlearm")


SECTIONS
{
. = 0x200000c0;

.program_info : {
*(.program_info*)
}

.text : {
*(.vtable*)
*(.text*)
*(.rodata*)
*(.data*)
*(.bss*)
}

/DISCARD/ : {
*(.ARM.*)
*(.comment*)

}
}

Каждое приложение, как и базовая система, предполагает использование ООП и поэтому представляет из себя реализацию класса IApplication. Для этого нам нужна некоторая runtime-поддержка: аллокатор, функция для создания экземпляра приложения, а также указатель на ISystem. Именно поэтому каждая программа должна экспортировать специальный заголовок, где содержится указатель на функцию-инициализатор:

#define PROGRAM_HEADER 0x1337
#define PROGRAM_INFO(name, clazz) int test; CAllocator* __Allocator; IApplication* __createInstance(CAllocator* allocator, ISystem* systemPtr) { __Allocator = allocator; return new clazz(systemPtr); } \
CProgramInfo __program_info __attribute__ ((section(".program_info"))) = { PROGRAM_HEADER, BIOS_VERSION, name, &__createInstance };

struct CProgramInfo
{
uint32_t Header;
uint32_t BIOSVersion;
CAnsiChar Name[32];

CreateApplicationInstanceFunction CreateApplicationInstance;
};

...

PROGRAM_INFO("Blink", CBlinkApplication)

Таким образом, для выполнения нашей программы и вызова её обработчиков событий нам достаточно лишь загрузить файл по адресу 0x200000c0 и создать экземпляр IApplication. Всё очень просто и понятно!

CAllocator allocator;
allocator.Alloc = malloc;
allocator.Free = free;

IApplication* app = ((CProgramInfo*)ptr)->CreateApplicationInstance(&allocator, System);

Но "моргалка" ведь слишком просто, согласитесь? Поэтому мы с вами напишем ремейк классической игры Змейка, которая работает в настоящие 60 FPS!

❯ Заключение

Вот таким нехитрым образом я понемногу реализовываю свою мечту детства: «андерграунд" консоль собственной разработки. Конечно здесь ещё много чего нужно доделывать перед тем, как начинать разводить свою плату, но начало ведь положено! В контексте GamePi13, я считаю что моя реализация SDK для консоли всё таки немного лучше, чем то, что предлагает производитель «из коробки».

Я понимаю что мой не совсем трушный эмбеддерский подход может вызвать разные ощущения у читателей: так что приглашаю всех заинтересованных в комментарии, обсудим с вами «сломанный Branch-prediction из-за виртуалов», «UB из-за того, что порядок указателей на реализации в VMT может отличаться» и «какого фига игры у тебя оказались в SRAM, а высокопроизводительный код на Flash, если у XIP кэш всего в 16КБ!».

А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статьи) можно найти на моём YouTube канале.

Если вам понравилась статья...

И у вас появилось желание что-то мне задонатить (например прикольный гаджет) - пишите мне в телегу или в комментариях :) Без вашей помощи статьи бы не выходили! А ещё у меня есть Boosty.

Что думаете о таком формате статей?
Всего голосов:
Если бы я собрался с духом и произвел 20-50 штучек консолей-самоделок с полностью готовым SDK, примерами и туториалами, купили бы себе такую
Всего голосов:
Что думаете о таком проекте?
Всего голосов:

Подготовлено при поддержке @Timeweb.Cloud

Показать полностью 18 3
284

«Fallout Terminal»: Robotron 1715М или наш ответ Vault-Tec родом из ГДР

Автор текста: MechNIX

Иногда полезно выбраться из привычной системы координат. Эта мысль посетила меня при взгляде на «Robotron 1715M». Не знаю, насколько привлекателен внешний дизайн этого компьютера, но в своеобразности взаимодействия с ним точно есть свой шарм.

❯ Аппаратная составляющая

Надо сказать, компьютер выполнен преимущественно из металла. Сам системный блок, клавиатура, монитор — всё металлическое. По весу очень тяжёлый; я попытался поднять системный блок со стоящим сверху монитором и чуть не сорвал спину. Вспомнился «Гроботрон» — видимо, повеяло прошлым.

Техническое описание компьютера — доступно здесь.

Наш экземпляр имеет «на борту»:

  • Центральный процессор UA 880D (аналог Zilog Z80);

  • Оперативную память объемом 256Кб (32 чипа в корпусе DIP);

  • Два дисковода 5'' (К5601), 80 дорожек, 800К;

  • Работает под операционной системой SCP 3.0, являющейся клоном CP/M.

Глянем составляющие:

Открутив три винтика, поднимаем крышку системного блока и видим, что треть пространства занимает блок питания (слева):

Смотрим на дисководы, расположенные сверху (К5601):

Кроме дисководов видим металлический охлаждающий вентилятор

Кроме дисководов видим металлический охлаждающий вентилятор

Интерфейсное подключение выполнено при помощи небольших платок. В синем кружочке отмечен перекрёст проводов — предполагаю, что для идентификации дисководов «А» и «В».

Модель и производитель:

Дисковод на 80 дорожек

Дисковод на 80 дорожек

Шасси дисководов держатся на двух удобных винтах с насечками для пальцев — снимаются очень легко:

Вот мы и добрались до плат. Их всего две:

Контроллер

И основная плата, которая содержит центральный процессор UA880D, работающий на частоте 4 МГц:

И поле оперативной памяти, объемом 256К (8Кб X 32):

ПЗУ производства СССР:

Надо отметить, что при подавляющем большинстве комплектующих ГДР, попадаются компоненты СССР:

Есть и Корея:

Чип зафиксирован клейкой лентой, предполагаю, от сползания из панельки. Отдирать не стал. Никакой деструкции с ретро:

Центральный процессор. В данном случае фиксирующая чёрная плёнка почти исчезла — можно разглядеть номинал. Выглядит «поюзанно». Плёнка будто сползла от температуры, что ли? Руками так не сдирают — она деформировалась и, похоже, стекла. Есть предположения?

Вообще, не совсем понятно назначение наклееных пленок, заклеек. Подскажите, для чего?

Тоненькие проводники, навитые на стержни. Любопытно, как навивали.

RFT-разъемы:

В завершение внешнего осмотра — интерфейсы.

Мы видим разъёмы для подключения дисплея MDA, принтера, внешнего floppy-дисковода и окно во внешний мир — протокол V.24. Благодаря ему мы и сможем почувствовать себя операторами, подключёнными к майнфреймам Всемирной паутины. А вот чем планировалось заменить заглушку под потенциальный разъём GRAF DISPLAY — интересно было бы найти.

❯ Дисковая подсистема

Так как жёсткий диск в принципе отсутствует, мы будем пользоваться двумя имеющимися дисководами. С одного загружается операционная система, на другом — дискета с данными. Удобно? Да. И дискового пространства больше — есть, где развернуться.

Профилактика — сначала почистим магнитные головки дисководов.

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

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

С профилактикой механики завершили, переходим к «софтовым мытарствам».

❯ Дела софтовые

Начнём с самого сложного (для меня) — с работы с дискетами. «Чего сложного, — скажете вы, — вставил дискету и работай». Но нет. Посмотрим-поглядим.

Прежде чем использовать дискету, её необходимо соответствующим образом записать. Отдельная песня — это работа с файловой системой SCP 3.0 (CP/M) для Robotron. Перепробовав тонну маленьких утилит под MS-DOS для форматирования, редактирования и записи образов, я так толком и не добился цели. Далее описан проверенный, простой и рабочий вариант для OS Linux, но чтобы его осознать и осуществить, пришлось просидеть несколько вечеров. Как оказалось, всё укладывается в несколько команд. Возможно, вам пригодится, да и мне — чтобы не забыть.

Дискеты можно и нужно использовать двойной плотности (DD). Вспомнили такие? 2S/2D означает «двухсторонние, двойной плотности».

Цель весьма простая — записать (дополнить) нужные файлы в готовые образы дискет и эти самые образы, а также записать на физические носители (дискеты). В итоге на помощь пришли пакеты cpmtools & fdutils для Linux.

После установки этих пакетов, необходимо отредактировать файл, находящийся по следующему пути: /etc/cpmtools/diskdefs. Файл описывает специфические парамеры, необходимые для работы дисковой подсистемы.

Файл описания форматов разных систем. Используем в качестве аргумента команды этот блок —параметр 17153

Файл описания форматов разных систем. Используем в качестве аргумента команды этот блок —параметр 17153

Далее все стало проще. Нам нужно изменить настройки контроллера дисковода. Делается при помощи setfdprm (из пакета fdutils). Запускаем команду со следующими параметрами:

После применения подготовительных параметров, форматируем (размечаем) дискету командой #fdformat /dev/fd0

Потом нас интересуют две команды: команда «#cpmls -f 17153 test.ima» выводит содержимое образа test.ima, а команда «#cpmcp -f 17153 test.ima tlc.com 0:», добавляет в образ файл tlc.com. Также существует команда «cpmrm», позволяющая удалять файлы из образа.

Следующей командой записываем свой модифицированный образ на дискету. Test.ima и scp30.cpm — это посекторные образы дискет.

Всего 3 команды, подытожим на живом примере:

Дискета готова

Дискета готова

Записанную таким образом дискету можно загружать в Robotron. Информация собиралась по крупинкам, моя благодарность этим источникам (вот и вот).

Результирующее видео:

❯ «Инжалид дежице»

Если вы увлекаетесь ретро-компьютерами, то вам наверняка встречалось сочетание «инжалид дежице». Мне, как и многим, смешно такое видеть; более того, это словосочетание утекло в мемы. Хочу чуть пояснить его на примере нашего «Роботрона».

Не удержусь — приведу уместную картинку, иллюстрирующую хитросплетение кодировок.

В описываемом компьютере используется древняя кодировка КОИ-7, не вплетённая в венок вышеприведённой картинки, а точнее — два её варианта: Н1 и Н2. В одном случае латинские буквы заменены на подходящие кириллические, а в другом заменены только строчные латинские буквы.

Вот пример для наглядности. Преднамеренное обращение к дисководу без дискеты порождает такое сообщение:

А после нажатия этой «волшебной» кнопки:

Мы видим:

Главное — результат достигнут, и смысл понятен в обоих случаях, правда? Такой вот своеобразный фонетический транслит.

Завершая, поясню: легендарное «инжалид дежице» означает Invalid device — дословно «неисправное устройство».

Здесь полное описание кодировки КОИ-7, а здесь объемлющее рассмотрение.

❯ Игры

Как правило, при взгляде на монитор «Роботрона» вспоминается Fallout. Наш сегодняшний «Фоллаут» будет состоять из игральных карт, мышей, машинок в виде цифр — а также текста.

Игра «Казино». Графического режима нет, но, на мой взгляд, изображения карт сделаны старательно.

Смотрим в динамике. Играть не умею, не обессудьте. На видео видно, как загружается операционная система и взаимодействие с ней в части запуска игры.

А вот игра с мышами — «MOUSE». Секрет этой игры в относительной простоте. Созданным из символов мышам и человечку воображение добавляло недостающие элементы, и в определённый момент тебе уже безразлична форма — ты захвачен динамикой погони. Потому что ты «начинал с этого».

Вводная часть

Вводная часть

Гонимся за мышами!

Еще одна аркадная игра — гонки с названием «Ралли»:

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

Результат:

Так бывает, когда вместо осмысленных цифр вводишь хаос символов

Игровой процесс:

«Тетрис»! О, эта игра не нуждается в представлении. Здесь она «на коне», потому что хронологически близка к первоисточнику. Алексей Леонидович Пажитнов написал её в 1984 году для компьютера «Электроника-60». Она живёт и на «Роботроне».

А теперь — мистификация. За правду в следующем абзаце не ручаюсь, но оцените идею. Повторюсь: в компьютере «Robotron 1715М» отсутствует динамик и, как следствие, звук. Нет звука в системном блоке, зато он есть в принтере.

Впечатляет реализация мифической игры «Диверсия» («DIWERSIQ»), в которой задействован звук «колокольчика» принтера «Robotron» — Bell. Как вам такое?

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

Всех игр для «CP/M» не опишешь. Есть ещё «Горилла» (воображение рисует «Кинг-Конга» на небоскрёбах) и множество других произведений для погружения в «ту эпоху игр».

Не обязательно иметь настоящий, «железный» «Роботрон» — существует эмулятор. Кому нужно, можно найти в Сети; если лень — могу поделиться, пишите.

❯ Внешний мир

Упомянутый выше протокол V.24 используется в реализации стандарта RS232. Для нас это означает, что мы можем использовать последовательное соединение через COM-порт.

Покопавшись в документации, нашел следующую «распиновку» разъема «Роботрона».

Заодно приведу и назначение контактов видео

Заодно приведу и назначение контактов видео

Далее, самым непростым делом было найти ответную розетку:

Но всё позади и мы видим нуль-модемный кабель для использования COM-порта любого современного компьютера:

«Железо» без «софта» мертво. С пайкой аппаратной части разобрались, а что мы имеем из программ для SCP3? В этой части — скудненько. Сначала удалось найти телекоммуникационную программу TLC. Вроде бы то, что нужно.

Развернув бурную деятельность, в части вызванивания исходящих данных из «Роботрона», я имел вот такую картину:

Данные передавались, но не те, которые я ожидал. Программа TLC не пропускала символы ASCII с кодом выше 127. Изменение количества бит с 8 до 7 тоже не принесло результата. Иными словами, я видел «квакозяблы» вместо осмысленных символов. Терминальную программу с поддержкой КОИ-7 мне найти не удалось. Если есть на примете — подскажите.

Материал получился очень объемным (много фото и видео), но весьма интересным. Всё не влезло :( Продолжение тут.

Написано при поддержке Timeweb Cloud.

Больше интересных статей и новостей в нашем блоге на Хабре и телеграм-канале.

Реклама ООО «ТАЙМВЭБ.КЛАУД», ИНН: 7810945525

Показать полностью 45 5
7

Основные ошибки при выборе смартфона — и как их избежать

Смартфон сегодня есть почти у каждого. А те, у кого нет — вряд ли вообще читают этот текст. Мы все хотя бы раз сталкивались с выбором нового телефона: что взять, какие характеристики важнее, стоит ли переплачивать?

И хотя кажется, что выбрать смартфон просто, ошибок при покупке совершают очень многие. Сегодня разберём самые частые — коротко, по существу, но с пояснениями.

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

1. Дороже — не всегда лучше

Это фраза, которую мы слышали сто раз. И она действительно верна, но не всегда.

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

Часто более доступная модель оказывается даже удобнее: меньше нагревается, дольше живёт от батареи, и просто стабильнее работает. Поэтому, когда выбираете между «топом» и «почти топом» — смотрите не только на цену, но и на баланс характеристик.

2. Осторожнее с китайскими версиями

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

Во-первых, часто это версии для внутреннего рынка Китая, и они не всегда поддерживают нужные частоты связи.

Во-вторых, у них могут не работать Google-сервисы — особенно на устройствах Xiaomi, Huawei и Honor (в определённых сериях).

Плюс, с гарантией бывают сложности: если смартфон сломается, отправить его обратно в Китай — целая эпопея.

И, наконец, не забывайте про таможенные пошлины — иногда «дешёвый» смартфон после всех сборов выходит по цене официального.

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

3. Гонка за герцовкой экрана

Сегодня производители активно хвалятся «частотой обновления 120 или 144 Гц». Звучит круто, но по факту разницу замечают далеко не все.

Да, в играх высокая герцовка важна. Но если вы не геймер, то между 90 и 120 Гц вы вряд ли почувствуете разницу.

Зато энергопотребление у 144-герцового экрана выше — и это напрямую влияет на автономность.

Оптимальное значение для большинства пользователей — 90 Гц: плавно, комфортно и без лишней нагрузки на батарею.

4. Мегапиксели ≠ качество фото

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

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

Именно поэтому топовые бренды (Sony, Apple, Samsung) всё чаще делают акцент именно на физический размер матрицы, а не на цифры в описании.

5. Самый мощный процессор не нужен каждому

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

Snapdragon 8 Gen 2, MediaTek 9200 или Dimensity 8300 спокойно тянут всё, включая тяжёлые игры. А переплачивать за «самый свежий» чип часто нет смысла.

Главное — чтобы система была оптимизирована, а не перегружена ненужными сервисами.

6. Недооценка памяти

«Мне хватит и 128 ГБ» — самая частая ошибка.

Часть памяти займёт система, ещё часть — приложения, мессенджеры, фото и видео. Особенно, если камера снимает в высоком разрешении.

Через полгода место закончится, и начнётся «танец с удалением».

Если есть возможность — берите хотя бы 256 ГБ. Разница в цене между версиями часто минимальна, а комфорта потом — в разы больше.

И не рассчитывайте на карты памяти: они медленные, ненадёжные и не заменяют встроенный накопитель.

7. Объём оперативки — не мелочь

Сегодня 8 ГБ ОЗУ — минимально комфортный уровень.

Если есть вариант доплатить немного за 12 ГБ — лучше доплатить. Особенно если вы берёте смартфон «впрок» на несколько лет.

Да, существует виртуальное расширение памяти, но оно медленнее и работает за счёт накопителя. Поэтому, когда есть выбор — берите реальную оперативку, а не «виртуальную».

8. NFC есть не везде

Кажется, что в 2025 году все смартфоны должны иметь NFC, но это не так. Некоторые бюджетные модели до сих пор выпускаются без него.

Если вы привыкли платить телефоном на кассе, обязательно проверьте, чтобы NFC был в характеристиках.

Особенно это актуально для Android — там не все модели поддерживают бесконтактную оплату из коробки.

9. Разрешение экрана ≠ качество картинки

QHD, FHD+, 2K — всё это звучит красиво, но само разрешение не гарантирует, что экран будет хорошим.

Куда важнее:

  • тип матрицы (AMOLED, IPS),

  • плотность пикселей,

  • равномерность подсветки и калибровка цветов.

Сейчас даже бюджетные модели предлагают достойную чёткость, так что гнаться за «максимальным разрешением» смысла нет. Лучше смотреть обзоры с реальными фото и сравнениями.

10. Ёмкость батареи — не показатель автономности

5000 мА·ч на Android и 3300 мА·ч на iPhone — а работают примерно одинаково. Почему? Всё просто: дело в оптимизации системы.

Время работы зависит от множества факторов: частоты обновления экрана, яркости, фоновых процессов, даже температуры.

Поэтому сравнивать телефоны по “голым” цифрам батареи бессмысленно — смотрите реальные тесты автономности.

11. Не покупайте флагман на последние деньги

Звучит банально, но многие этим грешат.

Телефон — вещь, которую можно уронить, потерять или просто разбить.

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

Флагман должен быть удобным, а не стрессом. Иногда разумнее взять субфлагман и не переживать лишний раз.

12. Важность бренда — не миф, но и не гарантия

Да, у крупных брендов выше надёжность и поддержка, но это не значит, что любой Samsung лучше любого китайца. В среднем сегменте у китайских компаний часто отличные модели с минимальной наценкой.

А вот у «мимоходных» брендов — вроде Redmond или Яндекс — смартфоны получаются слабо. Не у каждого производителя бытовой техники выходит хорошая электроника.

13. Другие частые ошибки покупателей

  • Не проверяют совместимость с другими устройствами (экосистема Apple, Samsung, Huawei).

  • Верят рекламе и промо-роликам, где картинку снимают на отдельную камеру.

  • Слушают консультантов, которым важно просто продать.

  • Не обращают внимания на сроки поддержки и обновлений.

  • И, конечно, верят каждому блогеру, не проверяя информацию.

После покупки — новые ошибки

Ошибки продолжаются и после покупки:

  • установка приложений из подозрительных источников,

  • игнорирование обновлений,

  • неправильная зарядка,

  • отсутствие чехла или стекла,

  • использование телефона в ванной или на морозе.

Мелочи, но именно из-за таких «пустяков» смартфоны чаще всего выходят из строя.

Заключение

Покупка смартфона — это не лотерея, если подходить с умом. Главное — не гнаться за цифрами, не верить рекламе и смотреть реальные тесты.

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

Поддержите материал лайком и подпиской — впереди ещё много полезных статей о технике, простыми словами и без маркетинговой шелухи.

Показать полностью 12
154

Ответ на пост «Для ждущих апокалипсис...»1

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

В яндексе ищется по строке: "site:<!--noindex--><a href="https://pikabu.ru/story/otvet_na_post_dlya_zhdushchikh_apokalipsis_13311015?u=http%3A%2F%2Faliexpress.ru&t=aliexpress.ru&h=4659255ba4b85b0dd1c06cd4ad22513f84d4a852" title="http://aliexpress.ru" target="_blank" rel="nofollow noopener">aliexpress.ru</a><!--/noindex--> 1005009589832003"

В яндексе ищется по строке: "site:aliexpress.ru 1005009589832003"

Напомню в чем суть этой моей рубрики.

Допустим встречаю где-то или пользуюсь постоянно чем-то, а оно, сцуко, неправильное! И мне как дипломированному диванному эксперду, конечно же, виднее как оно надо сделать, чтобы прям вот порвать рынок и захватить мир.

Сегодня мы поговорим про

Электрический мультитул выживальщика

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

Китайский я не знаю, но общая инженерная смекалка и переводчик позволяет предположить, что прибор оснащён:
- рукояткой генератора,
- двумя черными рифлёными колёсиками: нижнее - громкость и включение радиоприёмника, верхнее настройка оного по частоте
- заявлена поддержка трёх диапазонов: FM (87-108 MHz), SW1 (5.8-100 MHz), SW2 (11.6-18.2 MHz).

На торце видно:

- нагревающийся резистивный спот для прикуривания или поджигания чего-нбудь
- USB Type-C вход для заряда встроенных аккумуляторов (судя по надписи около него), и принимает этот порт 5 воль 1 Ампер
- USB Type-A для подзаряда от девайса какого-нибудь внешнего устройства (не нашел подробностей, но скорее всего 5 вольт и 2 китайских ампера в лучшие годы можно надеяться получить с этого порта).

Внутри обещают аккумулятор на 3.7 вольт 1Ah. К бабке не ходи - там внутре неонка стоит одна банка 18650. Странно, что китайцы, как водится, не приписали ей волшебную ёмкость в 100500 4 миллиона микроамперчасов. Обычно так и делают, а тут вполне реалистичная ёмкость для одной Б\Ушной банки, вытащенной из старого ноутбука на разборке.

Красная кнопка, судя по видео и надписям, отвечает за поджог папироски, а синяя за включение фонарика из двух белых светодиодов на торце.

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

Ещё китайцы что-то намудрили с джамперами. У кого есть идеи нафига они нужны - делитесь.

В инструкции сказано прям совсем туманно:

Пописаны джамперы на манер предохранителя (fuse?):

Как бы то ни было, имеется:

- Маленький хиленький повербанк без возможности смены аккумулятора и нормальной поддержки любых протоколов быстрой зарядки,
- Дохленький фонарик,
- Бестолковая и очень неэкономичная резистивная зажигалка, трёхваттная рукоятка для (хорошо если подзаряда внутреннего аккумулятора, но не факт же) автономности. Зная другие китайские аналоги таких девайсов, не исключено, что три джампера нужны как раз для переключения между подачей энергии с аккума и с генератора.
- Радио на три диапазона. Будут к нему ниже претензии.

Единственный, пожалуй, неоспоримый плюс этого устройства - это алюминиевый корпус и крутилка.

Что ж. Теперь давайте пофантазируем о том как выглядело бы идеальное устройство подобного класса и функциональности. В этом, собственно суть рубрики. Будем генерить концепцию устройства, которое будет по всем параметрам лучше предложенного на рынке.

Идеальный вариант:

- Цилиндрический прочный алюминиевый корпус, ухватистый, рифлёный, как фонарик.
- На торце рефлектор с линзой и хорошим ярким светодиодом. Утопленная кнопка на боковой поверхности, рядом два герметизированных Type-C разъёма, работающие как на вход (зарядка внутреннего аккумулятора), так и на выход (режим повербанка).
- Корпус состоит из сегментов, соединяемых на резьбе.
- Первый сегмент ближе к фонарику содержит батарейный отсек. Там должен помещаться один элемент 42120 или 6 штук 18650 (1s6p).
- Второй сегмент - генератор. Внутри соосно корпусу бесколлекторный трёхфазный генератор на неодимовых магнитах, планетарный редуктор с металлическими шестернями, обратная "лебёдка" с валом на храповике и подшипниках, выступающим сквозь боковую стенку корпуса. На валу лебёдки катушка с 6 метрами прочного шнура или троса.
- Торчащие наружу торцы вала с квадратным шлицом для установки съёмной рукоятки.
- "Лебёдка" с редуктором предназначена для гравитационного накопления энергии. Генератор подвешивается торцом с лебёдкой вниз, к тросу подвешивается груз ~10±5 кг. Груз постепенно разматывая лебёдку своим весом генерирует ЭДС заряжая аккумулятор.
- Вал лебёдки можно крутить ручкой снаружи наматывая трос или генерируя энергию.
- Ручка крепится на цилиндрический корпус снаружи на защелках.
- В отсек с катушкой лебёдки помещается комплект Type-С кабелей.
- Третий сегмент опциональный - радио. Содержит свой аккумулятор (18650), отсек с длинной гибкой проволочной антенной для КВ.
- Радио-модуль должен позволять слушать и параллельно сканировать (два независимых радио-тракта) стандартные частоты: 144, 433, 27 МГц, передавать на них (аварийная рация), слушать радиовещательные диапазоны.
- На боку радио-модуля небольшой Ч/Б ЖК-дисплей, отображающий частоты и режимы радио-модуля.

В итоге получается модульное посегментно герметичное устройство-фонарик-повербанк, в которое можно вкрутить один или больше сегментов с аккумулятором, опционально лебёдку-генератор, радио-модуль.

Оно будет хранить около 100Wh (~30Ah) энергии в одном батарейном сегменте. Представлять собой достаточно мощный фонарь с оптикой. Заряжаться и заряжать через TypeC устройства как повербанк. Подзаряжаться от подвешенного и медленно опускающегося груза.

Надо заметить, что груз массой 15 кг опускаясь на 6 метров за, скажем, 10 минут, будет давать все эти 10 минут примерно 1 ватт энергии. Если я не накосячил в расчетах. Придётся натаскать камней потяжелее на высоту и спускать их на лебёдке один за другим подзаряжая аккумулятор.

Интересно, насколько в таком режиме хватит шестерёнок лебёдки. Что-то я уже слабо верю в эффективность концепции. А уж заряжать крутя ручку и подавно бестолку.

Так, мужики-выживальщики-инженеры и дамы-выживальщицы-инженерки, вот моя панамка, накидывайте в чем я не прав, и почему этот продукт говно ещё большее, чем представленное в мини-обзоре. А если нет, то чего в нём не хватает? Крючков с леской? Тактического темляка из паракорда? Свистка? Сирены? Ракетницы? Универсального входа с DC-DC преобразователем, чтобы заряжаться можно было хоть от рельсов? Электрошокера? Дуговой плазменной зажигалки на 20кВ рядом с фонарём? КоСоГоРа (G.E.C.K)?

Яйца в кулак, держу панамку, накидывайте.

Яйца в кулак, держу панамку, накидывайте.

P.S. Если кто горазд "балакать" с нейросетями на предмет генерации картинок по техническому описанию - прикольно было бы в статью "рендеры" докинуть для визуализации идеи, так сказать...

Показать полностью 6
965

Ретропонедельник №224. АК-3 и БК-1

Начинаем новую неделю с очередных экспонатов виртуального музея советской бытовой техники. Сегодня это два девайса. Попробуйте угадать, что это-за устройтсва по фото:

Это слуховой аппарат.

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

Все настройки под крышкой батарейного отсека. Использовались два источника питания - "таблетки", скорее всего это были аккумуляторы. Заглянем внутрь, вы же этого ждете:

Микрофон

Микрофон

А вот еще одна модель: Кристалл, БК-1

Слуховой аппарат "Кристалл" выпускался с 1956 года Московским заводом слуховых аппаратов. Предназначен для компенсации потерь слуха по воздушной или костной звукопроводимости. Питание от 1-го элемента типа А. Максимальное акустическое усиление 55 дБ. Потребляемая мощность 10 мВт. Габариты 59х82х19 мм. Масса 125 г.

Внутри:

Схема:

Телеграм канал в профиле, если кому удобнее следить там.

Показать полностью 22
246

ВС РФ, РЭБ, воскресный пост

Мне до сих пор пишут в телегу по старым постам. Куда я пропал? Ну, большинству, конечно, пофиг. Но если кому интересно — последние три месяца я так или иначе работаю с ВС РФ, конкретнее — с подразделениями РЭБ.

Паяем антенны, собираем авто-РЭБ-боксы, ремонтируем блоки и прочее. Я не фанат всего, что происходит сейчас, и сам за то, чтобы всё это закончилось как можно скорее. Но когда вокруг постоянно прилетают ФПВ и БПЛА, я решил, что лучше применить свои руки и знания с пользой.

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

Если тут есть кто-то из подразделений РЭБ разных родов войск — можем помочь с ремонтом устройств. Если у кого-то завалялся сгоревший блок джаммера — можем взять на восстановление. Или просто принять в дар. Сейчас особенно актуальны диапазоны 2–3 ГГц.

ВС РФ, РЭБ, воскресный пост

И ещё момент: если вдруг кто-то хочет посодействовать с оборудованием/расходниками или рассматривает возможность попасть в РЭБ-подразделение по контракту — могу свести. Но это скорее для технически подкованных, без судимостей, возрастом примерно около 30 лет.

Ну и в остальном — всем привет! Не обижайтесь, если не отвечаю в телеге — реально не всегда есть возможность.

Будет время, запилю какой что нибудь на технические темы. Если еще кто нибудь из комментаторов обвинит в работе на ципсо, буду прямым текстом посылать нахуй. Всех обнял)

ps не про политику. Кто хочет устроить срач, го в другой пост.

Показать полностью 1
302
TECHNO BROTHER

«Дворовый фейсбук»: как Cybiko сделала уникальный КПК-социальную сеть в 2000 году

Мы давно с вами привыкли к соц. сетям, мессенджерам и сайтам знакомств. За долгие годы пребывания в сети, я видел взлёт и падение ВК, закрытие ICQ и появление Telegram, переход знакомств из реальной жизни — в Badoo и, наконец, появление AI-контента.

Сейчас эти ленты с мемами, каналы, шортсы, свайпы — всё это кажется такой обыденностью, будто это существовало всегда. Однако в конце 90-х, общение и потребление контента выглядели совсем не так и главный тому пример — уникальный КПК для общения Cybiko, способный создавать беспроводную локальную сеть в радиусе 300м. Что за гаджет разработала компания Давида Яна и что у него внутри — читайте в сегодняшней статье!

❯ Предыстория

Во времена когда телефоны всё ещё были аналоговыми, а SMS'ки — дорогими, основным способом коммуникации оставались пейджеры. Эти маленькие устройства обычно выполняли ровно одну функцию: «ловили» в общем эфире сообщения и выводили их на крохотный одно-или-двухстрочный дисплей. Даже у меня в детстве был пейджер, однако он ко мне попал скорее как символ ушедшей эпохи, поскольку в Ейске уже не существовало операторов...

В конце 90-х, у любого производителя была возможность представить миру свой собственный стандарт связи. Даже в обычных телефонах их было целых пять: GSM, CDMA-450, CDMA-800, NMT-450, AMPS и все между собой совместимы лишь условно или несовместимы совсем. Все эти стандарты во многом отличаются даже концептуально: ранние были полностью аналоговыми и полу-аналоговыми (AMPS и D-AMPS), поздние — полностью цифровыми, но с разными принципами разделения радио-слотов для абонентов. Какие-то поддерживали новомодный SMS, а какие-то использовались исключительно для общения.

Некоторые StarTAC'и бывали даже AMPS!

Некоторые StarTAC'и бывали даже AMPS!

Однако в те годы существовал и такой феномен, как двух-направленные пейджеры — достаточно редкий класс устройств, который умел не только принимать сообщения, но и отправлять их. В основном это были устройства бизнес-класса по типу Motorola PageWriter или BlackBerry 850, но в 2000-году, небольшой стартап Cybiko представил уникальное устройство, которое представляло из себя не столько пейджер, сколько молодёжный КПК с социальными возможностями и собственной беспроводной «локалкой»!

История Cybiko начинается в 1998 году, когда российский предприниматель Давид Ян, также известный как CEO компании ABBYY, основывает стартап под одноименным названием после исследования предпочтений подростков из шести стран. Уже к октябрю того же года у компании был готов прототип, а в 1999 выпущены первые предсерийные образцы и запатентован проприетарный протокол. Устройство разрабатывали параллельно в России и США: в Москве занимались прикладными приложениями и играми, тестированием, а также вероятно частями ядра CyOS, а в Америке — разработкой аппаратной части устройства, протоколом и основной части CyOS.

Первая версия Cybiko вышла в апреле 2000 года эксклюзивно для рынка США по невероятной, по меркам целого КПК, цене — всего 139$! В маркетинговых материалах особо подчеркивалось то, что Cybiko предназначен специально для подростков, поэтому трудолюбивые ребята могли в довольно краткие сроки накопить на свой собственной социальный компьютер. И это был хит: в первые выходные было продано около 179 тысяч устройств, а к концу года — целых 250 тысяч и с таким покрытием у гаджета были все шансы стать действительно социальным...

Дело в том, что основной фичей Cybiko была отнюдь не собственная операционная система CyOS с интерпретатором BASIC и возможностью писать собственные программы, не наличие встроенной памяти и абсолютно бесплатных приложений, которые появлялись каждый день, не возможность синхронизации с ПК и подключения MP3 модуля, а особая технология коммуникации, позволявшая объединять ближайшие Cybico в большую локальную сеть с числом абонентов аж до 3.000! Гаджет был не просто проводником в мир «беспроводных» знакомств, он сам был социальной сетью. Ко всему прочему, у Cybiko была довольно приличный радиус действия: максимальная дальность между двумя клиентами была от 150 до 300 метров — в зависимости от ландшафта и плотности застройки.

У дисплея не было подсветки — это довольно серьёзный минус.

У дисплея не было подсветки — это довольно серьёзный минус.

Уже через год, Cybiko представила вторую версию устройства — Xtreme, которая получила апгрейд процессора, оперативной памяти и аккумулятор вместо обычных батареек. Однако вместе с апгрейдом были нюансы: большинство программ с Cybiko Classic отказывалось работать на Xtreme, значительно урезая набор приложений. Добавьте к этому крах доткомов и обвал акций, а также необходимость отложить запуск из-за трагичного инцидента в сентябре 2001 года...

К сожалению, уже в 2002 году компания начала испытывать серьёзные финансовые проблемы и выделила подразделение, которое занималось разработкой программ, в отдельную компанию, которая начала разрабатывать приложения для устройств других брендов, а сама Cybiko прекратила полную поддержку своих устройств в 2003 году. Но несмотря на такое короткое время жизни Cybiko и практически полное забвение в наши дни, на eBay всё ещё можно встретить «чердачные» лоты с этим замечательным устройством по весьма приятной цене. И как гик я вас уверяю — оно действительно достойно внимания!

Он остаётся! Он будет здесь жить!

Он остаётся! Он будет здесь жить!

Несмотря на явные российские корни, Cybiko в России — устройство из разряда экзотических. Существовала версия CyOS на русском и некоторое число гаджетов было в распоряжении у сотрудников московского офиса, но за столько лет какие-то из них попали в частные руки коллекционеров, какие-то продолжают пылиться на чердаке, а часть вполне могла отправиться в утиль. Своего личного Cybiko у меня пока нет, однако благодаря подписчикам Роману и Андрею, у меня появилась возможность временно погонять Xtreme и подготовить о нём интересный контент.

❯ Что внутри?

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

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

Красотища!

Красотища!

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

Поскольку оригинальный Cybiko питался от двух AA-батареек, в Xtreme менять схему питания сильно не пришлось. В качестве главного домена питания здесь всё также выступает шина 3.3В/350мА, которая формируется повышающим DC-DC преобразователем MAX1677EEE из входных 2.5-3В. В паре с ним работает неизвестный чарджер с затертой маркировкой.

Чуть левее расположился чип 64-битного UID (уникального идентификатора) Max DS2401, используемый для дифференциации устройств в сети, аналоговый свич 74VHC4066, назначение которого я не установил, а также часы реального времени — Philips 8593T. Однако это не обычный RTC, а так называемая микросхема-календарь, которая в одном кристалле объединяет не только часы и дату, но и будильник!

Чуть ниже можно заметить кварц на 18МГц, который тактирует процессор устройства и на 24МГц, который тактирует контроллер USB. В оригинальном Cybiko использовался кварц на 11МГц, так что в Xtreme процессор заметно разогнали. Если у меня появится свой Сайбико — обязательно попробую разогнать ещё быстрее!

Ниже расположилось сердце устройства — кастомный микроконтроллер CYBOOT HD6432323G03F разработки Hitachi, построенный на базе собственной архитектуре H8S и работающий на уже вышеупомянутой частоте в 18МГц. Вообще, это довольно интересное семейство МК, поскольку они пережили эволюцию из 8-битных микроконтроллеров до 16-и, а затем и 32-х битных, при этом многие МК работали в смешанном 8/16-битном режиме.

Конкретно здесь используется 2323-ая вариация H8'ого, которая состоит из одного ядра, способного работать на частоте до 25МГц (есть потенциал для разгона), шестнадцати 16-битных регистров (либо 32 8-битных, либо 8 32х-битных — как в x86!) и возможностью адресации до 16МБ внешней памяти, контроллера внешней 8080-шины и DRAM, DMA-контроллера, таймера, ADC/DAC, UART, а также 32КБ загрузочной ROM и 8КБ встроенной ОЗУ. Совсем не кисло для тех лет!

Правее процессора расположился чип NOR-памяти SST 39VF040, объёмом всего в 512КБ, а чуть ниже — микросхема DRAM-памяти Samsung K4F171612D объёмом в 2МБ. Интересно то, что все данные хранились в ОЗУ и после полной разрядки аккумулятора данные терялись... Что-ж, такая проблема была у многих устройств тех лет. Рядом с антенной два флип-флопа 74VHC74, для чего они нужны — я не знаю.

Правее микросхемы NOR-памяти расположился внешний USB-контроллер National Semiconductor USBN9604-28M, наличие которого в 2001 году было довольно удивительным, по крайней мере для бюджетного устройства. Дело в том, что многие портативные гаджеты тех лет всё ещё поддерживали исключительно UART и COM-порты, а для подключения к ПК использовались внешние UART -> USB CDC преобразователи по типу FT232. Здесь же используется настоящий аппаратный USB, так что инженерам Cybiko можно только похлопать!

Переходим к RF-части, которая здесь не менее интересная, поскольку частично собрана на базе Atmel'овского микроконтроллера. В качестве сердца радиотракта выступает радиомодуль RF2915, который представляет из себя ASK FM-трансивер и включает в себя как модулятор, так и демодулятор. На практике это что-то типа 433МГц-модулей от SYN, однако управлять им несколько сложнее и он требует значительно больше обвязки. В паре с ним работает FM-синтезатор LMX2315.

Рядом с ними расположился легендарный «дедушка» из мира микроконтроллеров — Atmel AT90S2313-4SC, который являлся одним из первых популярных МК на архитектуре AVR. Внутри него скрывается вычислительное ядро, построенное на всем известной архитектуре и работающее на частоте до 10МГц (в Сайбико — 4МГц), 2КБ памяти, 128 байт EEPROM и столько же ОЗУ. Ардуинщики, слыхали какие AVR'ки использовали деды?!

Скорее всего AT90S является мостом между основным микроконтроллером и радиочастью устройства, эдаким фронтэндом, который скрывает от ОС детали реализации конкретного RF-тракта. Часть линий от порта расширения идёт как раз до AVR'ки — так что вероятно она отвечает и за него.

Уважаемый @DIHALT, что думаешь об этом МК? :)

Уважаемый @DIHALT, что думаешь об этом МК? :)

Вот таким был Cybiko «под капотом». Изначально я ожидал увидеть чипы-капли, проприетарщину и минимальную компонентную базу из-за низкой цены устройства, однако реальность превзошла ожидания и внутри это очень достойный представитель портативных гаджетов для своих лет: грамотно спроектированный, производительный и при этом недорогой.

Давайте же посмотрим, что из себя представляет операционная система устройства — CyOS!

❯ Включаем

После включения нас встречает диалог заполнения профиля. Здесь всё как на сайтах знакомств: сначала просят ввести имя или никнейм, затем указать возраст и ввести данные анкеты по типу цели знакомства и увлечений. Можно было даже установить своё фото, но исключительно в 4-х градациях серого... Тут ни ракурсы, ни фильтры были не нужны.

Задолго до Фейсбука, ВК и Баду тут был метчинг.

Задолго до Фейсбука, ВК и Баду тут был метчинг.

На секунду я даже задумался, что Cybiko мог быть прекрасным способом IRL-знакомств при помощи гаджетов: когда к девчонке вроде стесняешься подойти и заговорить лично, но если у неё есть Сайбико в радиусе 300м — то можно было сначала написать, поболтать, а затем и подойти познакомиться вживую :)

Если аккумулятор садился в ноль, «регистрироваться» приходилось заново

Если аккумулятор садился в ноль, «регистрироваться» приходилось заново

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

Поскольку Cybiko — социальный гаджет, мессенджер на момент выхода был достаточно функциональным. Помимо частных комнат и личных сообщений, здесь также были общие комнаты по интересам. При этом в общих комнатах не было модераторов или администраторов и при желании в чат можно было флудить и писать непотребства (вероятность получить «в тыкву» кратно возрастала =) ). Скорость соединения между устройствами в сети Cybiko составляла до 19.2Кбит в секунду, что для коротких текстовых сообщений было более чем достаточно — сравните с Payload'ом в современных мессенджерах!

А вдруг кто-то в радиусе 300м от меня всё таки сможет принять сообщение и ответить мне?!

А вдруг кто-то в радиусе 300м от меня всё таки сможет принять сообщение и ответить мне?!

Помимо обычных чатов, Cybiko также мог отправлять и получать сообщения по E-Mail. Однако делал он это не через операторские сети как другие двунаправленные пейджеры, а с помощью специального гейта, подключенного к компьютеру CyWIG. В таком случае, гаджет автоматически становился точкой доступа в интернет для всех устройств в радиусе действия, а с помощью приложения WAP-браузера даже позволял сёрфить ранний мобильный интернет!

Как и у любого КПК, в Cybiko были функции органайзера. Ежедневник, уведомления и будильник — джентльменский набор любого функционального гаджета тех лет. Я всё ещё вспоминаю цену в 199$ за Xtreme и сравниваю его с ценами на, хотя-бы, те же Psion Series 3... Всё таки Cybiko был уникален.

Как я уже говорил ранее, у Cybiko был рамдиск и встроенный файловый-менеджер, который поддерживал только свою собственную проприетарную файловую систему. В ОС видны зачатки поддержки карт памяти, однако следующий планируемый Cybiko — некий Project Halo, базировался уже на базе совсем другой Unix-подобной ОС, так что мечтам о полноценной поддержке флэшек не суждено было сбыться. В целом, Xtreme можно было использовать как небольшую 2-мегабайтную флэшку и переносить на ней какие-то данные с компьютера на компьютер, а также вероятно можно было обмениваться установочными файлами для приложений.

И вот с их установкой возникают некоторые проблемы. Помните я говорил о том, что Cybiko реализовали настоящий аппаратный USB, без всяких CDC-мостов? К сожалению, драйвер работает исключительно в Windows 2000 (даже в WinXP толком не работает), а программа для синхронизации очень кривая и крашится на любой чих. Через два часа постоянных ресетов и попыток подключения устройства, я всё таки смог создать шаткий и нестабильный коннект и закинуть немного приложений.

Программы для устройства предлагалось скачивать с официального сайта Cybiko. Как я уже говорил выше, компания обещала выпускать новое приложение или игру каждый день абсолютно бесплатно, а тем, у кого интернета не было, всегда можно было купить официальный диск-сборник. Очевидно что при таком потоке программ, далеко не все из них были качественными или представляли хоть какой-то интерес, поэтому Cybiko поощряла разработку новых приложений сообществом, предоставляя отдельное SDK с C-подобным скриптовым языком. Насколько я понял, программы были не нативными, а исполнялись в специальной виртуальной машине, однако переведя устройство в Boot-режим, можно было выполнять и нативные программы, собранные специально для архитектуры H8S.

Из приложений чего только не было: планировщики тренировок в зале и воркаута, браузеры, будильники, различные программы для выхода в интернет и коммуникации с другими устройствами. В играх же был сделан упор на мультиплеер, более того, в некоторые из них вообще нельзя было поиграть в одиночку! По правде сказать, локальный мультиплеер в Cybiko напоминал чуть более поздние Bluetooth-баталии в Bluetooth BiPlanes и после проводного мультиплеера в GameBoy Color это было настоящим прорывом!

❯ Заключение

Вот такой интересный гаджет сделала компания основателя ABBYY — Давида Яна. Концептуально устройство действительно интересное: Cybiko вышел как раз во время зарождения доступных сотовых сетей, которые в конечном итоге и не дали ему должного развития. Вышел бы он на года два ранее и не только в США... Даже немного обидно, что в нашей необъятной их осталось так мало...

Не могу не отметить и аппаратную часть устройства: внутри я ожидал увидеть бескорпусные чипы-капли и проприетарщину, однако на практике устройство собрано почти на стандартной элементной базе и его схема очевидна для любого ремонтника и DIY'щика, а значит всё кроме микроконтроллера и дисплея можно легко отремонтировать дома! А что вы думаете о Cybiko? Пишите своё мнение в комментариях!

А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статьи) можно найти на моём YouTube канале.

Если вам понравилась статья...

И у вас появилось желание что-то мне задонатить (например прикольный гаджет) - пишите мне в телегу или в комментариях :) Без вашей помощи статьи бы не выходили!

Подготовлено при поддержке @Timeweb.Cloud

Как вам Cybiko?
Всего голосов:
Что думаете о превращении Cybiko в меш-сеть, где сами клиенты сети выступают ретрансляторами?
Всего голосов:
А настолько подробные обзоры аппаратной части вам интересны? Или это уже перебор?
Всего голосов:
Показать полностью 24 3
80

Самодельная телега к мотоблоку

Рама из профильных труб 20x40 2мм, дышло профильная труба 40x40 3мм.

Рама из профильных труб 20x40 2мм, дышло профильная труба 40x40 3мм.

Ось профильная труба 40x40 3мм, К ней приварены вырезанные части со ступицами задней балки от ваз 2109, можно было и балку целиком, но она добавит лишний вес, так как в разы тяжелее профиля.

Ось профильная труба 40x40 3мм, К ней приварены вырезанные части со ступицами задней балки от ваз 2109, можно было и балку целиком, но она добавит лишний вес, так как в разы тяжелее профиля.

Настил и борта из досок 150x25.

Настил и борта из досок 150x25.

Сцепное устройство с демпфером, для компенсации рывков при начале движения.

Сцепное устройство с демпфером, для компенсации рывков при начале движения.

Тестируем грузоподъёмность.

Тестируем грузоподъёмность.

Добавлены дополнительные усилители дышла, во избежание прогиба под весом. Добавлены съёмные борта, наведён марафет.

Добавлены дополнительные усилители дышла, во избежание прогиба под весом. Добавлены съёмные борта, наведён марафет.

Получилась не дорогая по себестоимости, с не плохой грузоподъёмностью телега.

Получилась не дорогая по себестоимости, с не плохой грузоподъёмностью телега.

Показать полностью 7 1
Отличная работа, все прочитано!