Мой дневник

27.08.2010

Всем превед !

Filed under: Разное — sae762 @ 11:49

Долго думал, как организовать свое веб-пространство… И вот, придумал. Буду валить все свои записи в один поток, в один блог, но помечать категориями. Так что если что нужно найти – юзайте поиск. Но и категории почитать тоже полезно, мы ведь не всегда сами знаем что хотим найти…

07.02.2017

Маленький пингвин для маленькой системы

Filed under: Uncategorized — sae762 @ 17:11

или возвращение gentoo =)

Давненько я не устанавливал Gentoo. Десктоп собирать то еще удовольствие, ведь система ставится из исходников. Проще брать готовый Debian, или, если хочется именно Gentoo-way, то SystemRescueCD.  На серверах проще: нужно добавить всего несколько пакетов и не тянуть кучу зависимостей.

Собственно, потому и вспомнил о Gentoo для Orange Pi Zero. Дистрибутивы armbian в принципе ничего, но повергают систему в спячку так что пинг может достигать секунды. Можно настроить наверное. Но почему бы не собрать свою систему?

Для начала нужно создать загрузочную флешку. Скачал образ, с современным (mainline) ядром есть только ubuntu, да в общем без разницы.

  • Закатал образ на флешку через dd if=<образ> of=<флешка>
  • снес все файлы кроме /boot, /lib/firmware и /lib/modules
  • распаковал на флешку stage3 для armhf
  • поправил /etc/inittab, /etc/shadow
  • добавил portage

Загрузилось, серийная консоль работает, но в stage3 нет wpa_supplicant, и даже dhcpcd (

Простое решение – использовать eth0, но у меня нет проводной сети вообще. Пришлось заморочиться с мобилой: подключил андроид по usb, включил тетеринг, в системе появился rndis адаптер usb0. Но поскольку параметров для выставления вручную я не нашел, все же пришлось скачать отдельно исходники dhcpcd, закинуть их скажем в /opt и скомпилить. После этого сеть поднялась и emerge доустановил wpa_supplicant, dhcpcd, mc и все что нужно.

Чтобы избежать такого геморроя, могу предложить образ gentoo для заливки на флешку. Не знаю, надо ли кому, пишите – залью куда-нибудь

 

 

12.01.2017

Освещение комнаты на mongoose-iot

Filed under: Uncategorized — sae762 @ 11:06

пока standalone

Продолжение. Начало работы с mongoose-iot в предыдущей статье

Для примера я сделал систему управления лентой RGB и белой лентой для отдельной комнаты. Все что нужно добавить – веб-страницу интерфейса, в нашем случае с четырьмя слайдерами. После изменения положения слайдера в чип отправляется команда вида PWM.set(red,10000,value) и соответствующий канал меняет интенсивность свечения.

Несколько модификаций в системе. Можно их не делать, а вызывать страницу с домашнего веб-сервера.

  • перенес встроенный веб-сервер на порт 88 (через веб-страницу конфига)
  • переименовал встроенную страницу конфига с index.html в config.html
  • собственную страницу управления поставил как index.html

15871461_1285211388227636_5588909604704536074_n
15826727_1285211304894311_2186298967977520777_n
Планы:
– Нельзя опросить состояние каналов. Думаю, нужно добавить переменные, которые будут содержать значения pwm.
– В некоторых помещениях (кухня, коридор) уместно добавить детектор движения. Сейчас на кухне такое сделано, но на Arduino IDE. Нужно подобрать алгоритм зависимости освещенности от движения. Как раз посильная задача для javascript.
– Буду подключать датчики воздуха, термометр, и т.п.

так что продолжеие следует.

Ниже код самой страницы (команды обрабатываются на url /eval, см httpd.js из предыдущего поста, html вставляется плохо, просто скопировать не получится,если что спрашивайте):

<!DOCTYPE html>
<html>
<head>
<meta name=”viewport” content=”width=device-width, initial-scale=1″/>

var url=”http://192.168.1.180/eval&#8221; //for ext web
//var url=”/eval” //for inernal page

// common method
var http = new XMLHttpRequest();// one object instance

function send_eval(cmd) {
var params = “cmd=”+cmd;
document.getElementById(‘status’).value+=cmd+”\n”;
//jquery way also ok: $( “#status” ).val( $( “#status” ).val() + cmd+”\n” );
//sync (false) is deprecated but works better, connection always keep-alive (
http.open(“POST”, url, false);
//in case of sync.
//http.onreadystatechange = function() {
//if(http.readyState == 4 ) {
document.getElementById(‘status’).value+=http.responseText+”\n”;
//}
//}
http.send(params);
}

< script src=”https://code.jquery.com/jquery-1.12.4.js”></script&gt;
< script src=”https://code.jquery.com/ui/1.12.1/jquery-ui.js”></script&gt;

<link rel=”stylesheet” href=”//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css”/>
<style>
body {width: 100%;background-color: #DDDDDD; }
.p1 {text-align: center;}
#debug {width:100%; padding-left: 10%; padding-top: 20px;}
#status {width: 80%; height: 150px; }

#red, #green, #blue, #white {
clear: left;
width: 80%;
margin: 25px 15px 25px 10%;
}
#off {
width: 20%;
margin: 15px 15px 15px 10%;
}
#random {
width: 20%;
margin: 15px 10% 15px 0%;
}

#red .ui-slider-range { background: #ef2929; }
#red .ui-slider-handle { background:#ef2929; border-color: #ffffff; }
#green .ui-slider-range { background: #8ae234; }
#green .ui-slider-handle { background: #8ae234; border-color: #ffffff; }
#blue .ui-slider-range { background: #729fcf; }
#blue .ui-slider-handle { background: #729fcf; border-color: #ffffff; }
#white .ui-slider-range { background: #ffffff; }
#white .ui-slider-handle { background: #ffffff; border-color: #ffffff; }
</style>

//specific methods

pinR=13;
pinG=12;
pinB=14;
pinW=5;

//init recommend place to controller
$( function() {
cmd = ‘GPIO.setMode(‘+pinR+’,GPIO.OUT);’+
‘GPIO.setMode(‘+pinG+’,GPIO.OUT);’+
‘GPIO.setMode(‘+pinB+’,GPIO.OUT);’+
‘GPIO.setMode(‘+pinW+’,GPIO.OUT)’;
send_eval(cmd);
});

//jquery init
$( function() {
$( “#off,#random” ).button( {} );
$( “#random” ).click( rand );
$( “#off” ).click ( off );

$( “#red, #green, #blue, #white” ).slider({
orientation: “horizontal”,
range: “min”,
max: 10000,
value: 5000,
step: 200
});
$( “#red” ).slider( {change: setR} );
$( “#green” ).slider( {change: setG} );
$( “#blue” ).slider( {change: setB} );
$( “#white” ).slider( {change: setW} );
$( “#status”).hide();
});

//controls
function setR() {
v=$( “#red” ).slider( “value” )
send_eval(‘PWM.set(‘+pinR+’,10000,’+v+’)’);
}
function setG() {
v=$( “#green” ).slider( “value” )
send_eval(‘PWM.set(‘+pinG+’,10000,’+v+’)’);
}
function setB() {
v=$( “#blue” ).slider( “value” )
send_eval(‘PWM.set(‘+pinB+’,10000,’+v+’)’);
}
function setW() {
v=$( “#white” ).slider( “value” )
send_eval(‘PWM.set(‘+pinW+’,10000,’+v+’)’);
}

function off() {
//value change->setX called
$( “#red” ).slider( “value”, 0);
$( “#green”).slider( “value”, 0);
$( “#blue” ).slider( “value”, 0);
$( “#white”).slider( “value”, 0);
//turn off pwm
send_eval(‘PWM.set(‘+pinR+’,0,0)’);
send_eval(‘PWM.set(‘+pinG+’,0,0)’);
send_eval(‘PWM.set(‘+pinB+’,0,0)’);
send_eval(‘PWM.set(‘+pinW+’,0,0)’);
}

function rand() {.
//value change->setX called
$( “#red” ).slider( “value”,rnd());
$( “#green” ).slider( “value”,rnd());
$( “#blue” ).slider( “value”,rnd());
}

function rnd() {
return Math.floor(Math.random()*10000);
}

function debug() {
$(“#status”).toggle();.
$(“#status”).val(”);.
}

</head>
<body>

Anina Lampa

</div>

OFF
RAND

</div>

<textarea id=”status”></textarea>
</div>
</body>
</html>

 

 

Mongoose-iot и все-все-все

Filed under: Uncategorized — sae762 @ 10:50

…или мой обзор технологий для SoC

Традиционно, начал я с arduino и соответствующего IDE. Все было просто: пишем скетч – компилим – заливаем – работает. Или не работает. Отладка и заливка тут же на столе через serial порт.

Дальше появилась esp8266. И началось…

В целом Arduino IDE с модулем для esp8266 вполне работоспособное решение. Но специфика такова, что для прошивки нужно подпаять провода, замкнуть gpio0 на землю и только тогда прошить. Да и компиляция скетча выдает полностью новую прошивку. Все равно что при замене кнопки в ворде нужно было бы переустановить виндовс 😉 Словом, не очень гибкое решение, и мысль начала двигаться в сторону скриптовых языков.

Интересно было посмотреть на MicroPython. Реализация доступна для целого ряда систем, проект выглядит достаточно зрелым. Но язык мне не очень нравится, в частности его позиционность.

Солидно выглядит решение NodeMCU с их LUA script: можно насыпать разных скриптов в файловую систему и вызывать их по мере необходимости. Большое community, солидная документация. Забегая вперед, скажу, что считаю ее второй по удобству для себя, рзервом. Почему второй: как жависту мне не очень нравится язык LUA (особенно nil ;)), и, что более важно, NodeMCU все же ориентирован на свой контроллер, хотя конечно может развиться в многоплатформенный стандарт.

Тут же на глаза попался и весьма интересный проект Espruino. Система выгодно отличается от предыдущих наличием JavaScript. О самом языке можно конечно спорить, и мне в нем тоже не все нравится, но распространенность его, наверное, вне конкуренции. Espruino в свою очередь имеет встроенную telnet-консоль, что позволяет работать с чипом через wifi. К недостаткам следует отнести отсутствие файловой системы (можно добавить micro-sd, но это другая история), что не позволяет вызывать разные модули. Кроме того, espruino – прежде всего продвигает свой модуль на базе esp8266, так что портирование на другие чипы не входит в приоритеты.

Наконец, поиск довел меня до платформы mongoose-iot. Система имеет встроенный веб-сервер mongoose и самую компактную JS-машину. Как утверждают разработчики, этот код давно используется в микро-системах, даже в космосе. В отличие от espruino здесь встроена SPIFFS – файловая система, файлы можно заливать через веб-интерфейс. К сожалению, здесь тоже есть недостатки. Первый – это недостаток поддержки и документации. Community пока небольшое, но думаю потенциал есть. Второй недостаток, по моему мнению – мало средств для работы с системой через wifi: не видно консоли, нельзя послать команду кроме веб-страницы. Но этот вопрос решается достаточно просто, я дописал телнет-сервер и “веб-консоль”, куда можно отправить javascipt, он будет выполнен посредством eval(), и результат будет отправлен на страницу.

15873223_1285223501559758_2809025836598146840_n

//app.js – этот файл запускается системой при старте. try-catch обязателен, иначе любая ошибка в коде выведет из строя всю js-машину

try {
File.eval(“telnetd.js”);
File.eval(“httpd.js”);
File.eval(“main.js”);
}
catch (e) {
print(e);.
}

telnetd.js – моя попытка сделать телнет-консоль. в целом работает, но вывод реальной консоли уходит в serial, попытка подцепить UART закомментирована

var telnetd = tcp.createServer({}, function(sock) {
sock.write(“welcome, use sock.end() to close\n”);
//blocked console! UART(0).onRecv(function() { var u=UART(0).recv(); sock.write(u); });
sock.on(“data”, function(data) {
var res;
try {
res=eval(data);
} catch (e) {
res=e;
}
sock.write(res+”\n”, null, function() { });
});
sock.on(“close”, function() {sock.end();});
sock.on(“error”, function() {sock.end();});
sock.on(“timeout”, function() {sock.end();});
});

telnetd.listen(23, “0.0.0.0”, 0, function() {
print(“telnetd started”);
});

httpd.js – веб-консоль. по мне наиболе удобный инструмент. url /eval обрабатывает все поступающие на контроллер команды

//from beta4/docs/examples/http-server.md
var parse = function(query) {
var obj = {};
var pairs = query.split(‘&’);
for (var i = 0; i < pairs.length; i++) {
var x = pairs[i].split(‘=’, 2);
obj[x[0]] = x[1];
}
return obj;
}

//

var httpd = Http.createServer(function(req, res) {
// print(req);
if (req.url == ‘/eval’) {
var query = parse(req.body);
var cmd = query.cmd;
var rc;
try {
rc=eval(cmd);
} catch (e) {
rc=e;
}
res.writeHead(200, {‘Access-Control-Allow-Origin’: ‘*’}); //for cross-scripting
res.write(rc);
res.end();
} else {
res.serve();
}
});httpd.listen(80, function() {
print(“httpd started”);
});

main.js – скрипт для инициализации GPIO в нашем случае (см пост о моем проекте по освещению комнаты). может отсутствовать.

GPIO.setMode(12, GPIO.OUT);
GPIO.setMode(13, GPIO.OUT);
GPIO.setMode(14, GPIO.OUT);
GPIO.setMode(5, GPIO.OUT);
GPIO.setMode(2, GPIO.OUT);//test led

GPIO.write(12,0);
GPIO.write(13,0);
GPIO.write(14,0);
GPIO.write(5,0);
GPIO.write(2,1);

К сожалению, веб-консоль пока не полноценная. Сообщения системы поступают на serial-консоль и я не разобрался как их перехватить.

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

12.12.2016

Windows на MacOS

Filed under: компьютеры — sae762 @ 09:07

Или пара слов о bootcamp

На днях попросили переустановить windows на macbook air. Хорошо что не начал нахрапом все сносить, сначала погуглил. Смутило то, что windows стоит всего на одном физическом разделе диска.

Оказывается, в макоси все предусмотрено, в том числе и винодовс по соседству. Правильный подход (bootcamp) состоит в следующем:

  • скачать образ windows в виде iso
  • зайти в macOS (опции загрузки появляются, если сразу после стартового звука нажать Options)
  • в приложениях найти bootcamp (bootcamp assistant или как-то так)
  • bootcamp берет скачанный iso, выделяет место для винды на диске, и строит загрузочную флешку с нужными парамерами
  • перегружайтесь и устанавливайте виндовс с созданной флешки
  • затем можно в настройках установить какую систему загружать по умолчанию

По мне так очень грамотно все сделали, разработчикам макоси риспект и уважуха )

BTW, если эта винда вдруг сломается (например, вы решите сжать весь виндовый диск ;)) с помощью этой же флешки можно “восстановить систему”.

 

18.10.2016

GRUB2 на USB флешке, часть 2

Filed under: Uncategorized — sae762 @ 16:47

После прочтения предыдущей статьи вы можете спросить, “зачем grub2 если есть syslinux или unetbootin?”

А вот зачем:

I. grub2 умеет загружать системы из iso-образов! это означает, что можно просто скачать на флешку свежий образ системы, немного поправить grub.cfg –  и можно пробовать!  Ложкой дегтя здесь является то, что образ iso не является полной эмуляцией cdrom, так что загружаемая система должна уметь найти себя в iso-образе. Точно умеют это делать Ubuntu и SystemRescueCD (см параметры ядра в примерах), про остальные надо гуглить.

для Ubuntu/Xubuntu/итп:

set iso=”/xubuntu-16.10-desktop-linuxium.iso”
loopback loop $iso
set root=(loop)

menuentry “Try Xubuntu without installing” {
set gfxpayload=keep
linux /casper/vmlinuz.efi iso-scan/filename=$iso file=/cdrom/preseed/xubuntu.seed boot=casper zswap.enabled=1 zswap.compressor=lz4 splash —
initrd /casper/initrd.lz
}

для SystemRescueCD:

set loop1=”/systemrescuecd-x86-4.8.2-beta001.iso”
insmod loopback
loopback loop $loop1
set root=(loop)
set kernel32=”/isolinux/rescue32 scandelay=3 isoloop=$loop1
set kernel64=”/isolinux/rescue64 scandelay=3 isoloop=$loop1
set initrd=”/isolinux/initram.igz”

menuentry “SystemRescueCd (64bit, default boot options)” {
linux    $kernel64
initrd    $initrd
}

… другие опции из файла isolinux.cfg (там наиболее полный список)

II. Единый /grub.cfg для всех вариантов загрузки – существенно упрощает жизнь

III. Grub2 понимает не только fat, но и другие системы. Значит, можно загружать системы, файлы которых расположены не на usb, а на жестком диске компьютера. Например, можно сложить все файлы RemixOS прямо на диск C: (где windows), и загружать remix из меню нашей флешки:

#на диске с windows создаем папку C:/RemixOS, сливаем туда файлы и добавляем пустой файлик remix-hd для удобства поиска. Data.img будет создан в той же папке /RemixOS. DEBUG добавлен на этапе тестирования.

menuentry ‘HD mode ‘  {
insmod ntfs
insmod part_msdos
search –file –no-floppy –set=root /RemixOS/remix-hd
linux /RemixOS/kernel root=/dev/ram0 androidboot.selinux=permissive SERIAL=random logo.showlogo=1 DATA=/data.img USB_DATA_PARTITION=1 CREATE_DATA_IMG=1 SRC=/RemixOS DEBUG=1
initrd /RemixOS/initrd.img
}

IV. Наконец, зная grub, вам не придется забивать голову другими загрузчиками )

Хотел написать отдельный пост о Remix под NTFS, но в пункте III собственно все и сказано.

ЗЫ: не делайте submenu в grub.cfg: submenu не наследует переменных! (баг или фича сложно сказать)

17.10.2016

Только GRUB2

Filed under: компьютеры — sae762 @ 15:38

только хардкор… 😉

Перебрал несколько вариантов syslinux, extlinux итп, но зачем, если можно сделать единообразно и универсально?

Итак, простой метод создания универсальной загрузочной флешки USB для загрузки как в legacy bios, так и UEFI:

  1. Для grub2 нужен небольшой раздел для загрузчика, 1М достаточно, поэтому gdisk /dev/sdc и создаем: 1) 1M type 0xEF02 (именно так) и 2) на ваш вкус, обычно вся остальная флешка type 0x0700
  2. Форматируем только второй раздел, первый будет использован grub-ом и не монтируется
  3. Монтируем mount /dev/sdc2 /boot  (именно так, туда grub2 по умолчанию пишет свои файлы, наверное можно определить в команде, но проще примонтировать в /boot)
  4. Ставим grub2 для legacy bios: grub2-install –target=i386-pc [–removable]  /dev/sdc (опция removable тут кажется не нужна, но я ставил)
  5. Ставим grub2 для efi: grub2-install –target=x86_64-efi –efi-directory=/boot –removable  /dev/sdc
  6. Получилось на диске /dev/sdc две папки: EFI с загрузчиком grub2-64 и grub2 c модулями для grub-64 и grub-32.
  7. В папку /grub2 прописываем файлик grub.cfg, мне кажется удобно прописать лишь одну строку “configfile /grub.cfg” а уже в корне расположить большой конфиг для разных систем

 

12.10.2016

Linux for Chuwi Hi10

Filed under: компьютеры — sae762 @ 11:11

Продолжаю воевать с Chuwi Hi10

Поскольку определенный прогресс достигнут, решил создать специальную страницу

https://sae762.wordpress.com/linux-for-chuwi-hi10/

 

29.08.2016

Chuwi hi10 bios reset

Filed under: компьютеры — sae762 @ 10:51

При ковырянии в настройках bios возможна ситуация, когда видео перестает инициализироваться. Получаем рабочий планшет, но без экрана и hdmi. Выручает метод сброса в стандартные настрорйки “вслепую”:

  • выключаем, как понять что выключился – вопрос непростой, у меня например лампочка на хабе немного меняет интенсивность…
  • включаем и жмем много раз Del
  • нажимаем 1 раз Left затем 7 раз Down и 2 раза Enter
  • если попали в нужный пункт, сразу моргнет подсветка экрана
  • можно выключить и снова включить – экран заработает

Затем нужно снова зайти в bios, включить режим show all items, и в south bridge выставить SDIO SSD

Ну и какой же пост без картинки…

hi10-bios-screenв PCI mode, иначе wifi не запустится.

29.06.2016

Если нужно com.google.android.maps

Filed under: компьютеры — sae762 @ 16:38

Откопал на Stackexchange, на всякий случай сохраню

I had the similar problem on a real device. After a loot of googling I found this answer

fixing missing shared library. It turns out that on some custom roms the comp.google.android.map library is missing, you have to install it manually.

  • download googleapps
  • extract two files
  • system/etc/permissions/com.google.android.maps.xml
  • system/framework/com.google.android.maps.jar
  • remount the /system filesystem rw (mount -o rw,remount /system)
  • copy the files in
  • do a chmod 644 on them
  • reboot

27.06.2016

LiPo battery hack

Filed under: Uncategorized — sae762 @ 20:55

Если ваша батарея (в частности у меня baofeng uv-5r) разрядилась в ноль, и схема защиты наглухо отключила батарею, так что зарядка не идет, есть способ (к сожалению, срабатывает не всегда, см ниже):

  • отключаем батарею от рации
  • прикладываем напряжение 7-12В  к тем контактам, что идут к рации, иными словами к тем что сверху
  • держим минуту-две, этого достаточно чтобы батарея набрала свои 6-7 вольт для открытия схемы защиты
  • проверяем: отсоединяем напряжение и пробуем верхние клеммы батареи на язык. если напряжение есть, значит схема защиты отпустила батарею, если нет – подключаем напряжение снова (хорошо бы смотреть ампераж)
  • если напряжение есть, подключаем батарею к зарядному устройству и заряжаем как обычно

Дополнительные плюшки:

  • рация baofeng-5r вполне держит 12 вольт напрямую, в сети куча предложений “адаптеров” в прикуриватель, по сути – подключение напрямую
  • после того как китайский зарядник сгорел от 12 вольт, вполне успешно заменил внутреннюю схему мощным резистором, так чтобы ограничить с 12-13 вольт  ток 500-600 мА. такому адаптеру не страшна вода, но может поплавить корпус зарядника или распаяться

такой способ может подойти и для других литиевых батарей

на фото верхние контакты, плюс на фото справа

baofeng-battery-top

Если все совсем плохо и схема защиты не включилась, переходим к плану Б: разборка батареи BL-05 для baofeng uv-5r…

IMG_20160629_103155

контроллер прижат к нижней батарее с внутренней стороны (что конечно может отличаться в других версиях). Виден двойной mosfet 8205, схема управления не идентифицирована.

baofeng-batt-controller

теперь можно зарядить батареи и собрать обратно,

либо… в коробочку аккурат входят два элемента 18650 или 17670 🙂

 

Next Page »