Arduino L293 Motor Shield для raspberry Pi


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

Ни хрена подобного. Перерыв интернеты, не нашел ни одного вменяемого туториала, о том, как подключить драйвер к Raspberry Pi. Даже даташита нормального нет. Абсолютно непонятно, какой пин на плате отвечает за что. Есть картинка (см. выше) и указание использовать библиотеку AMSpi. Проблема только что бибkиотека чуть ли не для первой малины. Ну и, по факту, библиотека оказалась не очень рабочей, по крайне мере для подключения. изображенного на картинке.

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

Зачем сложно, если можно просто?

Не с того конца искусственный интеллект разрабатывают, как мне кажется.

Вместо того, чтобы грезить об андроидах, которые лучше чем люди, начать надо с собак.

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

Хрен с ними, с лапами. На ближайшие 5 лет и колес хватит.

С душой тоже не сложно:

Читать далее

Ф-я получения данных о состоянии системы

import psutil
import datetime
import platform


def get_system_info():

    result = {}

    # ОС
    os_platform = platform.system()
    # Процессор
    processor = platform.processor()
    result.update({'platform': os_platform, 'processor': processor})
    # диски
    disks = psutil.disk_partitions()
    for i in disks:
        try:
            disk_usage = psutil.disk_usage(i.device)
            total = int(disk_usage .total) / 1048576
            used = int(disk_usage .used) / 1048576
            free = int(disk_usage .free) / 1048576
            percent = float(disk_usage .percent)
            disk_dict = {'total_space': total, 'used_space': used, 'free_space': free, 'free_percent': percent}
            result.update({'disk_space': disk_dict})

        except:
            pass

    # загрузка процессора
    cpu_percent = psutil.cpu_percent()
    result.update({'cpu_percent': cpu_percent})

    # аптайм
    boot_time = psutil.boot_time()
    uptime = datetime.datetime.now().timestamp() - boot_time
    result.update({'uptime': uptime})

    # оперативка:
    mem_status = psutil.virtual_memory()
    m_total = int(mem_status.total) / 1048576
    m_available = int(mem_status.available) / 1048576
    m_used = int(mem_status.used) / 1048576
    m_free = int(mem_status.free) / 1048576
    m_percent = float(mem_status.percent)
    memory_dict = {'total_mem': m_total, 'available_mem': m_available, 'used_mem': m_used,
                   'free_mem': m_free, 'free_percent_mem': m_percent}
    result.update({'memory_space': memory_dict})

    # температура процессора:
    try:
        # ToDo скорее всего надо прописать итератор для перечня  датчиков
        proc_temp = float(psutil.sensors_temperatures().current)
    except:
        proc_temp = None

    result.update({'proc_temp': proc_temp})

    return result


if __name__ == "__main__":
    res = get_system_info()
    for i in res.keys():
        print(i, res[i])

Источники:

Читать далее

Re: Self.Tracker

В догонку к своему посту про самошпиона:

Есть такая система опенсорсная HomeAssistant, которая позволяет соединять воедино разные части умного дома. Система весьма гибкая и интересная и я ее даже одно время плотно использовал, хотя и ниасилил в полном объеме.

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

Из минусов - необходимость иметь статичный IP дома, привязывать его к внешнему домену и, самое главное - открывать порты. Внутренний параноик хмурится. Плюс - yaml для меня как то до конца непонятен.

Мой опыт использования HomeAssistant закончился на том, что система в какой то момент упала, а восстанавливать ее было лениво, особенно с учетом того, что все текущие домашние автоматизации худо-бедно ворочаются силами Яндекс.Устройств и Mi Home (пусть боги покарают ленивых ее создателей и всех кто продает в РФ поделки, привязывающиеся только к китайским серверам).

Но надо будет вернуться.

Соревнования танков с ИИ

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

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

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

Цена входа - наверное около 100 т.р. плюс команда из человека с руками и 3d-принтером + средней руки программист.

Но пока жаба душит. И нет под рукой 3d-принтера и человека с руками из плеч. Сам могу претендовать только на роль идеолога-программиста.

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

Функция конвертации секунд в более крупные периоды времени (Python)

Заметка

Функция  превращает количество секунд в удобночитаемые человеком  значения времени.

def seconds_to_str(uptime):
    """
       Функция принимает числовое значение секунд и возвращает строку в формате:
       '3 нед., 1 дн., 18 час., 23 мин., 3 сек.'
       Доли секунды округляются до секунд.
    """

    seconds = ''
    minutes = ''
    hours = ''
    days = ''
    weeks = ''
    uptime = round(uptime, 0)

    if uptime >= 60:
        minutes = uptime // 60
        if minutes >= 60:
            hours = minutes // 60
            if hours >= 24:
                days = hours // 24
                if days >= 7:
                    weeks = days // 7
                    seconds, minutes, hours, days, weeks = str(int(uptime % 60)), str(int(minutes % 60)), str(
                        int(hours % 24)), str(int(days % 7)), str(int(weeks))
                else:
                    seconds, minutes, hours, days = str(int(uptime % 60)), str(int(minutes % 60)), str(
                        int(hours % 24)), str(int(days))
            else:
                seconds, minutes, hours = str(int(uptime % 60)), str(int(minutes % 60)), str(int(hours))
        else:
            seconds, minutes = str(int(uptime % 60)), str(int(minutes))
    else:
        seconds = str(int(uptime // 1))

    if weeks:
        weeks = weeks + ' нед.,'
    if days:
        days = days + ' дн.,'
    if hours:
        hours = hours + ' час.,'
    if minutes:
        minutes = minutes + ' мин.,'
    if seconds:
        seconds = seconds + ' сек.'
    res = weeks + ' ' + days + ' ' + hours + ' ' + minutes + ' ' + seconds
    print(res.strip())
    return res.strip()

 

Функция определения времени суток (Python)

Заметка

Первый вариант: на основе словаря, более быстрый вариант:

import datetime
import time

def time_of_day_dict(dt=None, ts=None, tod_dict=None):
    '''
    Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict {час : наименование времени}
    Возвращает строку c временем суток. 
    При отсутствии аргументов - возвращает строку с текущим временем суток.

        Словарь по умолчанию: 
        {0: 'ночь', 1: 'ночь', 2: 'ночь',
         3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро',
         6: 'утро', 7: 'утро', 8: 'утро',
         9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня',
         12: 'обед', 13: 'обед', 14: 'обед',
         15: 'после обеда', 16: 'после обеда', 17: 'после обеда',
         18: 'вечер', 19: 'вечер', 20: 'вечер',
         21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер' }

    Eсли час не отражен в словаре, возвращает None
    Требует import datetime
    N.B. ф-я в 2-3 раза быстрее, чем ф-я time_of_day()
    '''

    # определение словаря
    if tod_dict:
        pass
    else:
        tod_dict = {0: 'ночь', 1: 'ночь', 2: 'ночь',
                    3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро',
                    6: 'утро', 7: 'утро', 8: 'утро',
                    9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня',
                    12: 'обед', 13: 'обед', 14: 'обед',
                    15: 'после обеда', 16: 'после обеда', 17: 'после обеда',
                    18: 'вечер', 19: 'вечер', 20: 'вечер',
                    21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер'}

    # определение оцениваемого времени
    if dt:
        if isinstance(dt, datetime.datetime):
            dt = dt
        else:
            print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt)))
            return None
    elif ts:
        if isinstance(ts, (int, float)):
            if ts > 0:
                dt = datetime.datetime.fromtimestamp(ts)
                print(dt.ctime())
            else:
                print('отрицательное значение ts недопустимо')
                return None
        else:
            print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts)))
            return None
    else:
        dt = datetime.datetime.now()
    h = dt.hour

    # подбор
    if h in tod_dict:
        tod = tod_dict[h]
        return tod
    else:
        print('Значение времени отсутствует в словаре')
        return None

 

Второй вариант, как пример того, как делать не надо ))

def time_of_day(dt=None, ts=None, tod_dict=None):
    '''
    Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict 
    {наименование времени : час окончания(включительно)}

    Возвращает строку c временем суток 
    При отсутствии аргументов - возвращает строку с текущим временем суток.

        Словарь по умолчанию: 
        {'ночь' : 3, 'раннее утро' : 6, 'утро' : 9, 'первая половина дня' : 12,
         'обед' : 15, 'после обеда' : 18, 'вечер' : 21, 'поздний вечер' : 24, }

    Если час не отражен в словаре, возвращает None
    Требует import datetime
    '''

    # определение словаря
    if tod_dict:
        pass
    else:
        tod_dict = {'ночь': 3, 'раннее утро': 6, 'утро': 9, 'первая половина дня': 12,
                    'обед': 15, 'после обеда': 18, 'вечер': 21, 'поздний вечер': 24, }
    sorted_tod = sorted(tod_dict.items(), key=lambda x: x[1], reverse=False)
    # print(sorted_tod)

    # определение оцениваемого времени
    if dt:
        if isinstance(dt, datetime.datetime):
            dt = dt
        else:
            print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt)))
            return None
    elif ts:
        if isinstance(ts, (int, float)):
            if ts > 0:
                dt = datetime.datetime.fromtimestamp(ts)
                print(dt.ctime())
            else:
                print('отрицательное значение ts недопустимо')
                return None

        else:
            print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts)))
            return None
    else:
        dt = datetime.datetime.now()
    h = dt.hour

    # подбор
    for time in sorted_tod:
        if h <= time[1]:
            tod = time[0]
            return tod
    print('Значение времени отсутствует в словаре')
    return None