DS3231 на Raspberry Pi и Orange Pi без использования модуля ядра

При использовании модуля ядра у меня возникла странная проблема. Данные в RTC DS3231 записывались не совсем корректные. Например, вместо 23.09.16 было такое (подключено к ATmega328). Подозрение упало на ntpd.
15-ccNVYcdc
Пересобирать ядро не очень хотелось, накидал два скрипта для установки даты и времени в малине и записи в RTC. Всё же стоит Gentoo. Для установки даты во время загрузки надо скрипт поместить в файл /etc/local.d/rtc.start и включить local командой rc-update add local default, если ещё не включен.

#!/bin/sh
s=`i2cget -y 1 0x68 0x00`
m=`i2cget -y 1 0x68 0x01`
h=`i2cget -y 1 0x68 0x02`
D=`i2cget -y 1 0x68 0x04`
M=`i2cget -y 1 0x68 0x05`
Y=`i2cget -y 1 0x68 0x06`
date `echo "$M$D$h$m""20$Y.$s"  | sed 's/0x//g'`

Для записи данных в DS3231:

#!/bin/sh
s=`date +"%S"`
m=`date +"%M"`
h=`date +"%H"`
D=`date +"%d"`
M=`date +"%m"`
Y=`date +"%y"`
i2cset -y 1 0x68 0x00 0x$s
i2cset -y 1 0x68 0x01 0x$m
i2cset -y 1 0x68 0x02 0x$h
i2cset -y 1 0x68 0x04 0x$D
i2cset -y 1 0x68 0x05 0x$M
i2cset -y 1 0x68 0x06 0x$Y
echo "$h:$m:$s $D.$M.$Y" | sed 's/0x//g'

Температуру с датчика можно получит командой i2cget -y 0 0x68 0x11.

Термометр на attiny24 с датчиком TMP35/TMP36

Термометр измеряет температуру от 0 до 99 С° с погрешностью не более ±2 С°. Выбор датчика осуществляется запаиванием перемычки на выводе 5 (PB2) U1. При подключении датчика TMP36 перемычку следует запаять между PB2 и Vcc, а при подключении TMP35 перемычку следует запаять между PB2 и GND. Питание термометра от 3 до 5 Вольт, ток потребления около 40 мА.
Выбор типа индикатора (С общим анодом или катодом) производится автоматически при включении.

t24

Внешний вид получился таким
qvbNJbgKxxk

Питание мультиметра от литиевого аккумулятора

Чтобы не оказаться в ситуации, что «Крона» села, а работать нужно, удобно использовать аккумуляторы. Готовые аккумуляторы можно купить в магазине, но они заряжаются вне самого прибора. То есть пользоваться им во время зарядки не выйдет, а время заряда достаточно большое.

Чтобы всегда иметь возможность быстро зарядить аккумулятор и избавиться от батарей, можно использовать литиевый аккумулятор. Но его напряжение при полном заряде всего 4,2В, что более чем в 2 раза меньше номинального для новой 9В батареи. Для этого используется преобразователь напряжения в отрицательное, но включенным для получения удвоенного напряжения. Собран он на U2  (LMC7660) и С2. Конденсатор С2 заряжается до напряжения питания, подключая внутренними ключами к выводам 3 и 8. После зарядки внутренние ключи подключают его к выводам 3 и 5, но на 3 вывод подключается + конденсатора. Частота переключения примерно 10кГц. Пульсации сглаживаются конденсатором С3.
Для правильной зарядки используется контроллер заряда U1 (STC4054) через разъём J1 (microUSB), чтобы заряжать можно было, иея под рукой кабель от большинства андроидов. Светодиод D1 нужен для индикации заряда. После окончания заряда он гаснет. Резистором R1 задаётся ток заряда, при сопротивлении 4,7к ток будет около 300мА.

Микросхема U4 (MCP130-300) служит для отключения преобразователя при разряде аккумулятора ниже 3,1-3В. Когда напряжение между 2 и 3 выводами больше 3,1В, транзистор Q1 открыт через встроенный резистор микросхемы. При снижении напряжения ниже 3В внутри микросхемы открывается транзистор, который подтягивает затвор Q1 к минусу питания, закрывая его. Транзистор Q2 применён 2N7002 из-за его напряжения открывания ниже 3В. Транзисторы типа IRFZ44N и подобные не подойдут из-за минимального напряжения выше 4В.

Схема

Аккумулятор был куплен за 50р, заявленная ёмкость 100мАч. Ток заряда 50мА. Заряда хватает на не менее недели ежедневного пользования по вечерам.

RubFoLVW_Hw

SqvnxG7chOE

6GCnXa9Qp8w

dqJjqQTFQpI

На M838 стало жалко MicroUSB. Поставил обычный разъём для круглого штекера. Аккумулятор, как видно, из старой нокии, хватает надолго. Ток заряда 300мА.

DP3BAqGKSIc

w_zhBRsKOAw

Аварийное освещение на литиевом аккумуляторе

Когда отключается питание, закрывается транзистор Q1, шунтирующий затвор Q2 на землю. Транзистор Q2 открывается через резистор R10 и внутренний резистор в U4, являющейся монитором питания, шунтирующей затвор на землю, закрывая Q2 при напряжении ниже 3,1В.
Чтобы свет не включался днём, стоит фоторезистор R2 и компаратор с открытым коллектором U2. Фоторезистор R2 направляется в сторону окна, а резистором R6 настраивается чувствительность на свет.
U3 нужна для зарядки Li-Ion или Li-Po аккумулятора. Чтобы аккумулятор постоянно не разряжался компаратором и не заряжался снова, стоят диоды-шоттки D7, через которые в нормальном режиме компаратор запитан от стабилизатора U1, так как напряжение на аккумуляторе ниже, чем после стабилизатора.
Питание от трансформатора 7-15В 100-500мА. Стабилизатор U1 на 5В, необходимый ток и рассеиваемую мощность.
Схема

Отправка СМС с модема ZTE MF823

Для python 2.

#!/usr/bin/python

# coding: utf8

from time import gmtime, strftime	
import urllib
import pycurl
import sys

host = '192.168.8.1'
port = '80'

reload(sys)
sys.setdefaultencoding('utf8')
text=sys.argv[1]
text=text.encode("utf-16-be")
msg="".join("{:02x}".format(ord(c)) for c in text)
number = '+7***'

time=strftime("%y;%m;%d;%H;%M;%S;+5", gmtime())

url = 'http://'+host+':'+port+'/goform/goform_set_cmd_process'
post = urllib.urlencode({'notCallback' : 'true', 'goformId' : 'SEND_SMS', 'isTest' : 'false','Number' : number, 'sms_time': time, 'MessageBody': msg, 'encode_type' : 'UNICODE', 'ID' : '-1'})
c = pycurl.Curl()
c.setopt(pycurl.URL, url)
c.setopt(pycurl.REFERER, 'http://'+host+':'+port+'/index.html')
c.setopt(pycurl.VERBOSE, 0)
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, post)
c.perform()
print '\n'

Для python 3.

#!/usr/bin/python

# coding: utf8

from time import gmtime, strftime
import urllib
import pycurl
import sys
import urllib.parse

host = '192.168.8.1'
port = '80'

text=sys.argv[1]
text=text.encode("utf-16-be")
msg="".join("{:02x}".format(c) for c in text)
number="+79***"

time=strftime("%y;%m;%d;%H;%M;%S;+5", gmtime())

url = 'http://'+host+':'+port+'/goform/goform_set_cmd_process'
post = urllib.parse.urlencode({'notCallback' : 'true', 'goformId' : 'SEND_SMS', 'isTest' : 'false','Number' : number, 'sms_time': time, 'MessageBody': msg, 'encode_type' : 'UNICODE', 'ID' : '-1'})
c = pycurl.Curl()
c.setopt(pycurl.URL, url)
c.setopt(pycurl.REFERER, 'http://'+host+':'+port+'/index.html')
c.setopt(pycurl.VERBOSE, 0)
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, post)
c.perform()
print("\n")
$ python sms.py "любой текст"

Загрузка Fedora по сети

Нужно установить syslinux, dhcpd и tftpd.

Настройка dhcpd
/etc/dhcp/dhcpd.conf:

subnet 192.168.0.0 netmask 255.255.255.0 {option routers 192.168.0.1;
option subnet-mask 255.255.255.0;
option domain-name "error";
option domain-name-servers 8.8.8.8;

option time-offset +6;

range 192.168.0.10 192.168.0.20;
filename "pxelinux.0";
next-server 192.168.0.1;

Установка Fedora 22

Из-за странного бага сначала нужно установить dnf:

# dnf --installroot=$PWD install dnf --releasever=22 --nogpgcheck

иначе будет «[Errno 2] Нет такого файла или каталога: u’/var/lib/tftpboot/Fedora22/var/lib/dnf/groups.json'». После этого можно установить все необходимые пакеты и среду рабочего стола, например, LXDE:

# dnf --installroot=$PWD groupinstall "Минимальная установка" "Рабочая среда LXDE" --releasever=22 --nogpgcheck

Список доступных групп можно посмотреть командой

# dnf grouplist
# dnf --installroot=$PWD --releasever=22 --nogpgcheck install kernel-PAE

После установки нужно создать пользователя и сменить пароль для root:

# chroot .
# passwd
# useradd ahkur -m -U
# passwd ahkur
# exit

Если при изменении пароля будет «passwd: Ошибка при операциях с маркером проверки подлинности», во всём винить selinux.

Создание меню загрузки и настройка syslinux

В папку /var/lib/tftpboot/ скопировать pxelinux.0 из пакета syslinux.

# cd /var/lib/tftpboot/
# ln -s /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

Создать папку pxelinux.cfg, а в ней файл default.
# mkdir pxelinux.cfg
В этом файле содержится меню загрузки.

default vesamenu.c32
timeout 100
menu clear
menu background splash.png

label Boot from local hard disk.
	localboot 0

label Fedora 22
	kernel Fedora22/boot/vmlinuz-PAE
	append initrd=Fedora22/boot/initrd-PAE.img rootfstype=nfs init=/usr/sbin/init root=/dev/nfs rw nfsroot=192.168.0.1:/var/lib/tftpboot/Fedora22/ ip=192.168.0.3:192.168.0.1:192.168.0.1:255.255.255.0:llama0::off noapic acpi=off xdriver=vesa nomodeset

vmlinuz-PAE и initrd-PAE.img указать те, что были установлены в папке boot
192.168.0.3 — IP клиента;
192.168.0.1 — IP шлюза;
255.255.255.0 — маска;
llama0 — имя хоста;
noapic и acpi=off — при возникновении некоторых проблем;
xdriver=vesa nomodeset — работа с драйвером видео vesa.

Настройка NFS

# echo "/var/lib/tftpboot/fedora19/ 192.168.0.1/24(rw,no_root_squash,async)" >> /etc/exports

Запустить tftpd

# /usr/sbin/in.tftpd -4 -u root -v -s /var/lib/tftpboot -B 1024 -l

SELinux залогиниться не даст, надо его отключить:

# sed -i 's/SELINUX=enforcing/SELINUX=disable/' etc/selinux/config

 

 

2016

Преобразователь 12-19В для зарядки ноутбука

КПД преобразователя примерно 90%. Больше всего потерь на диоде D2, установленного на радиатор. Транзистор во время работы почти не греется. Дроссель был сделан на Ш с зазором от какого-то блока питания. Его можно рассчитать в любой программе для расчёта дросселей. C4 и L1 решил исключить из схемы. Вместо подстроечного R5 подобрал R6, сделанный из манганина.

Схема преобразователя для ноутбука.
UC3843_UP_SC
Читать далее Преобразователь 12-19В для зарядки ноутбука

Скрипт для отправки сообщений ВКонтакте на Python

./vk.py text

#!/bin/python
#-*- coding: utf-8 -*-

import vk
import sys

#Авторизация через токен
access_token=''
vkapi = vk.API(access_token=access_token)

#Проверка прав доступа
#permissions = vkapi('account.getAppPermissions')
#print(permissions)

#чтение сообщений 
response_out=vkapi.messages.get(out=1,count=1)
response_in=vkapi.messages.get(count=1)
#Получение ID последнего полученного сообщения
guit_in = response_in['items'][0]['id']
#Получение ID последнего отправленного сообщения
guid_out = response_out['items'][0]['id']

#Получение ID последнего сообщения
if guid_out > guit_in:
	guid=guid_out+1
else:                                                                                   
	guid=guit_in+1                                                                  
                                                                         
#Отправка сообщения                                                                     
vkapi.messages.send(user_id=41497129,chat_id=100500,message=sys.argv[1],guid=guid)

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

Пример ссылки авторизации.

http://oauth.vk.com/oauth/authorize?client_id=APP_ID&redirect_uri=https://oauth.vk.com/blank.html&scope=offline,messages&display=mobile&response_type=token