Авторизация
Регистрация

Напомнить пароль

PY32F002A — Cortex-M0+ 32KB flash, 4KB RAM: ардуиним ниже плинтуса

Если кто-то из проницательных читателей сталкивался с этим очередным китайским чудом, наверняка спросит — какую траву автор курит? У них же по спецификации 20 KB флеша и 3 KB оперативки. Странная цифра 3 в наше время, когда у каждого настоящего программиста 16 пальцев на руках — чтобы считать было легче. Но еще не вечер, подождите и почитайте дальше. Мимо такого чуда, даже если спецификации были бы правдой, пройти невозможно — его продают за 9...11 центов штука в розницу. Увидев такую халяву, я немедленно заказал 20 штук на попробовать. Попробовав — еще с полсотни, в кулацком хозяйстве пулемет завсегда сгодится. За такую цену эта вещь для пионеров и пенсионеров — действительно вещь.

Для интересующихся — все равно же кто-то спросит — я его покупал здесь.

Любителем Windows больших проблем с программированием этих контроллеров нет, Keil uVision поддерживает эти микроконтроллеры, хотя и не их «каропки», но все же. А с сайта Puya Semiconductor можно скачать загрузчик, позволяющий с помощью последовательного интерфейса прошивать эти контроллеры. Но Keil и разработка… Нет, все понятно — их компиляторы лучшие. Но редактор — Боже мой, как можно так жить? Лет 30 назад лучше ничего и не было, но сейчас же куча редакторов, которые и дополнять код умеют, и 90 процентов ошибок еще на этапе написания выявят и помогут их исправить? И все это совершенно безвозмездно, т. е. даром.

У Keil есть еще один неоспоримый плюс — его можно поставить под Wine в Linux вообще без проблем. Естественно, вся отладочная аппаратура работать не будет, но компилировать можно. Учитывая, что программы размером до 32 кбайт он компилирует без денег — для PY32F002A и любительских проектов очень подходит.

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

 

— Что же из этого следует? — Следует жить,

шить сарафаны и легкие платья из ситца.

— Вы полагаете, все это будет носиться?

— Я полагаю, что все это следует шить.

 

Когда эти микросхемы пришли, я два дня убил, пытаясь заставить их работать через SWD и свисток-клон st-link. В конце-концов терпение лопнуло и хотел было все это забросить. Но если китайцам хватает последовательного загрузчика, почему мне это должно быть в падлу? Вроде религия позволяет, и миллионы ардуинщиков вполне довольны загрузкой AVR и всяких ESP32 через адаптеры последовательного порта USB? Миллионы мух не могут ошибаться.

 

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

Загрузчик лежит здесь — но скачать может быть проблемой, mail.ru стал давать скачивать файл только 5 раз в день. Меркантильные кю, куда этот мир катится? За снятие ограничений рубль просят — а где я вам его возьму?

Пока я этот загрузчик писал, решил заодно тест памяти сделать — ну не может микросхема такого сорта за такую цену быть без подвоха. Когда я тестировал флеш, чип смотрел на меня, как кот, который знает, где спрятал колбасу: подвох нашелся — 20 кбайт протестировалась, а он все тестирует и тестирует. Натестировал 32 кбайта, на этом остановился. Интересно девки пляшут…

А сколько же оперативки тогда? С нормальным тестом обломился — оказалось, что встроенный загрузчик позволяет из оперативной памяти читать только по 4 байта, а писать вообще не позволяет. Ну да ладно, читаю каждый 256-байт и смотрю на его случайность — как должно быть после сброса. После примитивного теста — 4 кбайта у микропроцессора всяко разно есть.

Стал искать, что поэтому поводу в интернетах пишут — да, не я первый. Народ уже давно нашел у чипа и избыток памяти, и обнаружил недокументированный PLL, с которым контроллер уже и на 48 МГц работать может. Особо буйные разогнали его на 64 МГц, но, говорят, уже не вся периферия держится, ну и скорость чтения флеша уже подстраивать надо. Так же у него обнаружили еще один UART, SPI и якобы несуществующий DMA. Судя по всем найденным ништякам — это PY32F030.

Крвткий список обещаний и реальности:
 

Cortex-M0+ (24 МГц) -> Cortex-M0+ (48 МГц) с PLL и DMA
Flash 20 КБ -> 32 КБ
RAM 3 КБ -> 4 КБ
UART 1 -> 2
SPI 1 -> 2
ADC 1x12-bit
Компаратор - 2
I²C
TIM1, TIM16, LPTIM  -> +3 таймера
Питание 1.7–5.5 В

Небольшое лирическое отступление — так как PlusPda не позволяет никаких вложений, кроме графики, и размер текста ограничен — а исходники программатора перевалили 30 килобайт, стал думать, а как же все это обойти? Выход оказался прост — заархивировал исходники и разбил их в несколько QR кодов. Самый большой их них позволяет хранить почти 3 килобайта, заархивированные исходники заняли 4 картинки. Интересно, какой длинны нужен забор, чтобы на него наклеить закартиненный инсталлятор Windows?
Если кому идея понравилась, ниже найдете питоновый код — пользуйтесь на доброе здоровье, он преобразует любые файлы в картинки и обратно — картинки в файлы. Главное — порядок картинок не перепутать, это никак не контролируется — хотя и можно, но лень.

 

qr_file.py
#!/usr/bin/env python3
import argparse
import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import SquareModuleDrawer
import os
import sys
import zlib
import base64
import re
import warnings
from typing import List
from PIL import Image
import pyzbar.pyzbar as pyzbar

# Suppress warnings
warnings.filterwarnings("ignore")
os.environ['ZBAR_SILENT'] = '1'

def show_usage_instructions():
    print("""
QR File Encoder/Decoder Tool
===========================

Usage:
  To encode a file into QR code(s):
    qr_file.py encode -i <input_file> [-o <output_template>] [-v <version>] [-e <error_level>] [-b <box_size>]
  
  To decode QR code(s) back to a file:
    qr_file.py decode -i <input_qr> -o <output_file>

Options:
  encode:
    -i, --input       Input file to encode (required)
    -o, --output      Output template (default: output.png)
    -v, --version     Max QR version (1-40, optional)
    -e, --error       Error correction level (L,M,Q,H, default: L)
    -b, --box         QR module size in pixels (default: 10)

  decode:
    -i, --input       Input QR image (required)
    -o, --output      Output file name (required)

Examples:
  qr_file.py encode -i document.pdf -o doc_qr.png
  qr_file.py decode -i doc_qr.png -o restored.pdf

Note: For large files, multiple QR codes will be created automatically.
""")

def calculate_max_qr_size(version: int, error_correction: int) -> int:
    """Calculate maximum data size for specified version and error correction level"""
    capacity_table = {
        qrcode.constants.ERROR_CORRECT_L: [
            17, 32, 53, 78, 106, 134, 154, 192, 230, 271, 321, 367, 425, 458, 520, 586, 644, 718, 792, 858,
            929, 1003, 1091, 1171, 1273, 1367, 1465, 1528, 1628, 1732, 1840, 1952, 2068, 2188, 2303, 2431,
            2563, 2699, 2809, 2953
        ],
        qrcode.constants.ERROR_CORRECT_M: [
            14, 26, 42, 62, 84, 106, 122, 152, 180, 213, 251, 287, 331, 362, 412, 450, 504, 560, 624, 666,
            711, 779, 857, 911, 997, 1059, 1125, 1190, 1264, 1370, 1452, 1538, 1628, 1722, 1809, 1911, 1989,
            2099, 2213, 2331
        ],
        qrcode.constants.ERROR_CORRECT_Q: [
            11, 20, 32, 46, 60, 74, 86, 108, 130, 151, 177, 203, 241, 258, 292, 322, 364, 394, 442, 482,
            509, 565, 611, 661, 715, 751, 805, 868, 908, 982, 1030, 1112, 1168, 1228, 1283, 1351, 1423, 1499,
            1579, 1663
        ],
        qrcode.constants.ERROR_CORRECT_H: [
            7, 14, 24, 34, 44, 58, 64, 84, 98, 119, 137, 155, 177, 194, 220, 250, 280, 310, 338, 382,
            403, 439, 461, 511, 535, 593, 625, 658, 698, 742, 790, 842, 898, 958, 983, 1051, 1093, 1139, 1219, 1273
        ]
    }
    return capacity_table[error_correction][version-1] if version <= 40 else capacity_table[error_correction][-1]

def find_optimal_version(data_size: int, error_correction: int) -> int:
    """Find minimum QR version that can accommodate the data"""
    for version in range(1, 41):
        if data_size <= calculate_max_qr_size(version, error_correction):
            return version
    raise ValueError("Data too large for QR code (max version 40)")

def split_filename(filename: str) -> tuple:
    """Split filename into base name and number"""
    match = re.match(r'^(.*?)(\d+)?$', os.path.splitext(filename)[0])
    return match.group(1), int(match.group(2)) if match.group(2) else None

def encode_file(input_file: str, output_template: str, qr_version: int = None, 
               error_correction: int = qrcode.constants.ERROR_CORRECT_L, box_size: int = 10):
    """Encode file into one or multiple QR codes"""
    with open(input_file, 'rb') as f:
        file_data = f.read()
    
    compressed_data = zlib.compress(file_data)
    encoded_data = base64.b64encode(compressed_data)
    
    max_chunk_size = calculate_max_qr_size(40, error_correction) - 10
    chunks = [encoded_data[i:i+max_chunk_size] for i in range(0, len(encoded_data), max_chunk_size)]
    
    if len(chunks) > 1:
        print(f"File too large, splitting into {len(chunks)} QR codes")
    
    for i, chunk in enumerate(chunks):
        chunk_with_meta = f"{i+1}/{len(chunks)}:".encode() + chunk
        optimal_version = find_optimal_version(len(chunk_with_meta), error_correction)
        if qr_version is not None:
            optimal_version = min(optimal_version, qr_version)
        
        qr = qrcode.QRCode(
            version=optimal_version,
            error_correction=error_correction,
            box_size=box_size,
        )
        
        qr.add_data(chunk_with_meta)
        qr.make(fit=True)
        
        img = qr.make_image(image_factory=StyledPilImage, module_drawer=SquareModuleDrawer())
        
        if len(chunks) > 1:
            base, ext = os.path.splitext(output_template)
            output_file = f"{base}{i+1:02d}{ext}"
        else:
            output_file = output_template
        
        img.save(output_file)
        print(f"Created QR code: {output_file} (version {optimal_version})")

def find_related_qr_files(base_file: str) -> List[str]:
    """Find all related QR files for assembly"""
    base, ext = os.path.splitext(base_file)
    base_name, _ = split_filename(os.path.basename(base))
    
    dir_path = os.path.dirname(base_file) or '.'
    pattern = re.compile(rf'^{re.escape(base_name)}(\d+){re.escape(ext)}$')
    
    related_files = []
    for f in os.listdir(dir_path):
        if pattern.match(f):
            related_files.append(os.path.join(dir_path, f))
    
    if not related_files:
        return [base_file]
    
    related_files.sort(key=lambda x: int(split_filename(os.path.basename(x))[1]))
    return related_files

def decode_file(input_file: str, output_file: str):
    """Decode one or multiple QR codes back to file"""
    qr_files = find_related_qr_files(input_file)
    print(f"Found {len(qr_files)} QR files to process")
    
    all_data = bytearray()
    total_parts = None
    
    for qr_file in qr_files:
        try:
            img = Image.open(qr_file)
            decoded = pyzbar.decode(img)
            
            if not decoded:
                raise ValueError(f"Failed to decode QR code: {qr_file}")
            
            data = decoded[0].data
            
            if b':' in data:
                meta, chunk = data.split(b':', 1)
                part_info = meta.decode().split('/')
                current_part = int(part_info[0])
                total_parts = int(part_info[1]) if total_parts is None else total_parts
                
                if total_parts != int(part_info[1]):
                    raise ValueError("Mismatch in QR code parts count")
            else:
                chunk = data
                if len(qr_files) > 1:
                    raise ValueError("Missing part number information in QR code")
            
            all_data.extend(chunk)
            print(f"Processed QR code: {qr_file}")
            
        except Exception as e:
            raise ValueError(f"Error processing {qr_file}: {str(e)}")
    
    if total_parts is not None and len(qr_files) != total_parts:
        raise ValueError(f"Found {len(qr_files)} parts, expected {total_parts}")
    
    try:
        compressed_data = base64.b64decode(all_data)
        file_data = zlib.decompress(compressed_data)
        
        with open(output_file, 'wb') as f:
            f.write(file_data)
        
        print(f"\nFile successfully restored: {output_file}")
        print(f"File size: {len(file_data)} bytes")
    
    except Exception as e:
        raise ValueError(f"Error decoding data: {str(e)}")

def main():
    # Show instructions if no arguments provided
    if len(sys.argv) == 1:
        show_usage_instructions()
        sys.exit(0)
        
    parser = argparse.ArgumentParser(description='Convert file to QR code(s) and back', add_help=False)
    subparsers = parser.add_subparsers(dest='command', required=True)
    
    encode_parser = subparsers.add_parser('encode', help='Convert file to QR code(s)')
    encode_parser.add_argument('-i', '--input', required=True, help='Input file')
    encode_parser.add_argument('-o', '--output', default='output.png', 
                             help='Output image template')
    encode_parser.add_argument('-v', '--version', type=int, 
                             help='Max QR code version (1-40)')
    encode_parser.add_argument('-e', '--error', default='L', choices=['L', 'M', 'Q', 'H'], 
                             help='Error correction level (L, M, Q, H)')
    encode_parser.add_argument('-b', '--box', type=int, default=10, help='QR module size')
    
    decode_parser = subparsers.add_parser('decode', help='Convert QR code(s) back to file')
    decode_parser.add_argument('-i', '--input', required=True, 
                             help='Input QR image file')
    decode_parser.add_argument('-o', '--output', required=True, help='Output file name')
    
    # Add help option manually
    parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
                      help='Show this help message and exit')
    
    args = parser.parse_args()
    
    error_mapping = {
        'L': qrcode.constants.ERROR_CORRECT_L,
        'M': qrcode.constants.ERROR_CORRECT_M,
        'Q': qrcode.constants.ERROR_CORRECT_Q,
        'H': qrcode.constants.ERROR_CORRECT_H
    }
    
    try:
        if args.command == 'encode':
            encode_file(
                args.input,
                args.output,
                qr_version=args.version,
                error_correction=error_mapping[args.error],
                box_size=args.box
            )
        elif args.command == 'decode':
            decode_file(args.input, args.output)
    except Exception as e:
        print(f"Error: {e}", file=sys.stderr)
        sys.exit(1)

if __name__ == '__main__':
    main()

 

 

 

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

 

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

Не буду вас долго утомлять, большинству это будет абсолютно фиолетово, а для интересующихся все лежит тут.

Работает все двояко — с одной стороны в Visual Studio Code и Platformio вы можете пользоваться всеми супер-пупер возможностями хорошей среды разработки, а когда все написано — запускаете make и имеете бинарный файл, который тут же прошиваете.

 

И не благодарите — все файлы и библиотеки я стащил у Keil, естественно, с gcc все это работать не будет. Некоторое время пришлось убить, чтобы все это перелопатить — кроме меня, все это никто не тестировал, но у меня пока все работало без проблем — мой тестовый пример, где я тестировал таймер и последовательный интерфейс.

main.c
#include "py32f002ax5.h"



void Delay(uint32_t count) 
{
  while (count--)  __NOP();    
}



// Константы для конфигурации тактовой частоты
#define HSI_FREQUENCY  24000000UL // Частота HSI в Гц
#define HSI_FS_VALUE   4          // Значение для 24 МГц
// Функция настройки системного тактирования
void SystemClock_Config(void)
{
  // 1. Настройка и включение HSI (24 МГц)
  RCC->ICSCR &= ~RCC_ICSCR_HSI_FS_Msk;                // Очистка поля HSI_FS
  RCC->ICSCR |= (HSI_FS_VALUE << RCC_ICSCR_HSI_FS_Pos); // Установка 24 МГц
  RCC->CR |= RCC_CR_HSION;                            // Включение HSI
  // 2. Ожидание стабилизации HSI
  while (!(RCC->CR & RCC_CR_HSIRDY));                 // Ждем готовности HSI
  // 3. Настройка делителей и источника тактирования
  RCC->CR &= ~RCC_CR_HSIDIV_Msk;                      // Отключение делителя HSI
  RCC->CFGR &= ~(RCC_CFGR_HPRE | RCC_CFGR_PPRE);      // AHB и APB без деления
  RCC->CFGR &= ~RCC_CFGR_SW;                          // Выбор HSI как источника
  RCC->CFGR |= RCC_CFGR_MCOSEL_0;                     // Настройка MCO (HSI)
  // 4. Ожидание переключения на HSI
  while (RCC->CFGR & RCC_CFGR_SWS);                   // Ждем подтверждения
  // 5. Обновление переменной системной частоты
  SystemCoreClock = HSI_FREQUENCY;
}


void TIM1_PWM_Init(void)
{
  // Включить тактирование TIM1 и GPIOA, GPIOB
  RCC->APBENR2 |= RCC_APBENR2_TIM1EN; // Включить тактирование TIM1
  RCC->IOPENR |= RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN; // Включить тактирование GPIOA и GPIOB

  // Настройка пинов PB3 (TIM1_CH2), PA0 (TIM1_CH3), PA1 (TIM1_CH4), PA7 (TIM1_CH1)
  GPIOB->MODER &= ~(GPIO_MODER_MODE3); // Сбросить режим для PB3
  GPIOB->MODER |= GPIO_MODER_MODE3_1; // Альтернативная функция
  GPIOA->MODER &= ~(GPIO_MODER_MODE0 | GPIO_MODER_MODE1 | GPIO_MODER_MODE7); // Сбросить режим для PA0, PA1, PA7
  GPIOA->MODER |= (GPIO_MODER_MODE0_1 | GPIO_MODER_MODE1_1 | GPIO_MODER_MODE7_1); // Альтернативная функция

  GPIOB->AFR[0] &= ~GPIO_AFRL_AFSEL3; // Сбросить AF для PB3
  GPIOB->AFR[0] |= (1 << GPIO_AFRL_AFSEL3_Pos); // AF1 для TIM1_CH2

  GPIOA->AFR[0] &= ~(GPIO_AFRL_AFSEL0 | GPIO_AFRL_AFSEL1 | GPIO_AFRL_AFSEL7); // Сбросить AF для PA0, PA1, PA7
  // AF13 для TIM1_CH3, AF13 для TIM1_CH4,  AF2 для TIM1_CH1N
  GPIOA->AFR[0] |= (13 << GPIO_AFRL_AFSEL0_Pos) | (13 << GPIO_AFRL_AFSEL1_Pos) | (2 << GPIO_AFRL_AFSEL7_Pos);  

  // Настройка TIM1 для PWM 16 кГц
  TIM1->ARR = 1499; // Период для 16 кГц при 24 МГц (24,000,000 / 16,000 - 1)
  TIM1->PSC = 0; // Предделитель = 1 (без деления)

  // Настройка PWM режима для каналов 1, 2, 3, 4
  TIM1->CCMR1 &= ~(TIM_CCMR1_OC1M | TIM_CCMR1_OC2M); // Сбросить режимы каналов 1 и 2
  TIM1->CCMR1 |= (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE); // PWM Mode 1 + предзагрузка для CH1
  TIM1->CCMR1 |= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2PE); // PWM Mode 1 + предзагрузка для CH2
  TIM1->CCMR2 &= ~(TIM_CCMR2_OC3M | TIM_CCMR2_OC4M); // Сбросить режимы каналов 3 и 4
  TIM1->CCMR2 |= (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3PE); // PWM Mode 1 + предзагрузка для CH3
  TIM1->CCMR2 |= (TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4PE); // PWM Mode 1 + предзагрузка для CH4

  // Включить выходы каналов (CH0 - комплементарный)
  TIM1->CCER |= TIM_CCER_CC1NE | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E;

  // Установить duty cycle
  TIM1->CCR1 = 150; // 10% для CH1 (PA7 NE)
  TIM1->CCR2 = 375; // 25% для CH2 (PB3)
  TIM1->CCR3 = 750; // 50% для CH3 (PA0)
  TIM1->CCR4 = 1125; // 75% для CH4 (PA1)

  // Включить автопредзагрузку и таймер
  TIM1->CR1 |= TIM_CR1_ARPE; // Включить автопредзагрузку
  TIM1->BDTR |= TIM_BDTR_MOE; // Включить основные выходы
  TIM1->CR1 |= TIM_CR1_CEN; // Включить TIM1
}


// Инициализация UART (PA2 - TX, PA3 - RX)
void UART_Init(void)
{
  // Включить тактирование USART1
  RCC->APBENR2 |= RCC_APBENR2_USART1EN;
  
  // Настройка пинов PA2 (TX) и PA3 (RX)
  GPIOA->MODER &= ~(GPIO_MODER_MODE2 | GPIO_MODER_MODE3); // Сбросить режим
  GPIOA->MODER |= (GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1); // Альтернативная функция
  GPIOA->AFR[0] &= ~(GPIO_AFRL_AFSEL2 | GPIO_AFRL_AFSEL3); // Сбросить AF
  GPIOA->AFR[0] |= (1 << GPIO_AFRL_AFSEL2_Pos) | (1 << GPIO_AFRL_AFSEL3_Pos); // AF1 для USART1

  // Настройка USART1: 115200 бод, 8 бит, 1 стоп-бит, без паритета
  //USART1->BRR = SystemCoreClock / 115200; // Делитель для 115200 бод при 24 МГц
  // HSI not calibrated well
  USART1->BRR = 22300000 / 115200; // Делитель для 115200 бод при 24 МГц  
  USART1->CR1 = USART_CR1_RE | USART_CR1_TE | USART_CR1_UE | USART_CR1_RXNEIE; // Включить приемник, передатчик, USART и прерывание по приему
  NVIC_EnableIRQ(USART1_IRQn); // Включить прерывание USART1
}

// Функция отправки символа по UART
void UART_Transmit(uint8_t data)
{
  while (!(USART1->SR & USART_SR_TXE)); // Ждать, пока буфер передачи не пуст
  USART1->DR = data; // Отправить символ
}

// Переменная для хранения последнего принятого печатаемого символа
volatile uint8_t last_printable_char = '#'; // По умолчанию '#'
volatile uint8_t rx_received = 0; // Флаг получения символа

// Обработчик прерывания USART1
void USART1_IRQHandler(void)
{
  if (USART1->SR & USART_SR_RXNE) // Проверка флага RXNE
  {
    uint8_t received = USART1->DR; // Чтение принятого символа
    if (received >= 32 && received <= 126) // Проверка на печатаемый символ
    {
      last_printable_char = received; // Сохранение символа
      rx_received = 1; // Установка флага получения
    }
  }
}


int main(void) 
{
  SystemClock_Config();

  // Настройка GPIOB
  RCC->IOPENR |= RCC_IOPENR_GPIOBEN; // Включить тактирование GPIOB
  GPIOB->MODER &= ~GPIO_MODER_MODE0; // Сбросить режим
  GPIOB->MODER |= GPIO_MODER_MODE0_0; // Выход
  GPIOB->OTYPER &= ~GPIO_OTYPER_OT0; // Push-Pull

  TIM1_PWM_Init();
  
  UART_Init();

  while (1) 
  {
    GPIOB->ODR ^= GPIO_ODR_OD0; // Переключить пин
    UART_Transmit(last_printable_char); // Отправить последний печатаемый символ или '#'
    Delay(500000); // Задержка
  }
}

Ну а с ардуино я пошутил — не собираюсь я писать ардуино фреймворк, зачем мне это? Может кто напишет, а может и уже где-то лежит написанный. А для большинства народа любая плата с микропроцессором — это ардуино, детали никому не интересны.

Нафига козе баян — вообще-то я хотел переделать газонокосилку, простую тупую газонокосилку, которая ездит как попало по газону, ограниченному проводом-периметром.

Со временем — кстати, не таким и большим, ей чуть больше 5 лет, у нее разъемы пришли в состояние, как было когда-то у советских ЭВМ — попинаешь платы, пошевелишь разъемы — она дальше работает. Подозреваю, связь самая прямая — ее произвела фирма из Израиля, а там сплошь наши люди. Вот и хотел выкинуть все провода и разъемы, оставить только питание и прокинуть LIN между модулями — CAN для нее все-таки жирновато.

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

 

Но что делать с ее навигацией — так пока и не решил. Супер-пупер GPS с сантиметровой точность и дорогая, и под деревьями работать не будет. Пылесосные лидары солнечный свет плохо переносят — косить по ночам? Ну, да — «в самый жуткий час мы волшебную косим трын-траву!». Думал про фазовую радиопеленгацию — за небольшие деньги точность получается метр и хуже. С оптикой свои проблемы — но, наверно, самые простые. Короче, буду дальше думать и косить бензиновой жужжалкой. А то заедет на соседский газон — проблем не оберешься. Сосед — какой-то косильный маньяк, и если его лишить удовольствия косить свой газон — я даже боюсь думать о последствиях.

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

 

Добавить в избранное
+185 +273
свернутьразвернуть
Комментарии (130)
RSS
+
avatar
+49
Обалдеть. Обзор из поговорок. Шанхайские барсы, хитрая на выдумки голь и трын-трава в одном флаконе.
+
avatar
+2
а я всё думал: как же это назвать. благодарю за определение)
+
avatar
+72
  • -kan-
  • 22 июня 2025, 12:43
Ничего не понятно, но очень интересно
+
avatar
+9
Интересно,
а для широкого круга обывателй, можно рассказать, как из этого градусник «запилить»?
А, то не совсем понятно зачем все это нужно.
(Лайкнул, конечно, добра автору и творческих успехов, от всей души желаю)
+
avatar
+14
Я бы добавил к этому крепкого здоровья, если это вообще возможно…
+
avatar
+4
Присоединяюсь, к пожеланию
+
avatar
+14
  • DVANru
  • 22 июня 2025, 12:56
Короче, буду дальше думать и косить бензиновой жужжалкой.
У селебрити таких проблем нет — фанаты косят вручную!
Нужно просто завести армию фанатов!
Пример:
Эмоциональная поклонница сжимает в руках пучок травы, по которому прошёл Ринго Старр — ударник группы The Beatles. Аэропорт Лос-Анджелеса, США, 1964 год.
+
avatar
+10
"… Я готов целовать песок
По которому ты ходила ..."
+
avatar
+4
Куракоды — это, конечно, хорошо, но есть же старый добрый uuencode! :-)
+
avatar
+1
До сих пор практикую base64.
+
avatar
+26
А просто залить на GitHub? Да не… слишком просто.
+
avatar
0
и архив смыйл ру? дану, а как ограничений наставить на 5 скачиваний в день ежикам? )
+
avatar
+1
RAR-JPEG жи есть.
+
avatar
+2
Не катит, муська пережимает, клеит логотип и вложение теряется. Да и не только муська, раржпеги к сожалению осиались в прошлом
+
avatar
+1
муська пережимает
Ну так есть же и другие картинкохостинги
+
avatar
+8
  • riuson
  • 22 июня 2025, 18:57
Посторонние картинкохостинги плохи тем, что они закрываются, меняют условия, удаляют картинки.
С годами статьи, их использующие, превращаются в
нечто
+
avatar
+1
Ну вот я навскидку не вспомню ни одного, который загружает картинки эз из. Подозреваю — специально против самых умных сделано)
+
avatar
0
Куракоды — это, конечно, хорошо, но есть же старый добрый uuencode! :-)
Опередили. Только хотел написать, что куары — это современные ююки :)
+
avatar
+3
Куракоды выгоднее — на муське есть ограничение на размер обзора. После uuencode вы всё равно получите текст, то есть, будете достаточно стремительно расходовать размер обзора. А картинка с 3 КБ данных занимает в обзоре байт 100, сколько надо на тег и ссылку. То есть, картинками можно закодировать намного больше :)

Но проще и правильнее на гитхаб, конечно.
+
avatar
+2
  • rexen
  • 23 июня 2025, 22:41
Какая-то хня получается. Муська протестует против «многа букафф», но радостно всасывает кило-мега-байты картинок? Шизофрения же. Текст же принципиально экономичнее, чем текст в виде картинки!
+
avatar
+1
Возможно, дело не в объеме — если вы напишете обзор на мегабайт, его не будут читать) А если вы дополните его картинками на 100 МБ — их просто посмотрят.
+
avatar
+3
но есть же старый добрый uuencode! :-)
эх… в фидошное время наююкать порнушных картинок — это же святое дело!
+
avatar
0
так дело ж как раз наоборот интересовало.
Обойти ограничение символов картинками.
+
avatar
0
Насчет навигации — что думаете про FTM в ESP32C3?
+
avatar
+1
Думал — даже при 4 антеннах с базой полметра, точности никакой не получается — на краях участка хуже метра. Кроме того эти 4 засинхронизировать надо — не реально.
+
avatar
0
В смысле с базой полметра? 4 точки по углам участка, и вычислять расстояние до каждой, не?

Между двумя точками у меня на расстоянии в 20 метров средний разброс получается порядка 10см… проверить на большем количестве точек пока не могу — еще не приехали еспшки.
+
avatar
0
если на работе стоит 2 и больше антенн, по разности фаз можно определить направление на каждый из 4-х передатчиков по углам.
если вы определяетесь по RSSI, то при наличии препятствий в виде деревьев и прочего — точности не будет. Если футбольное поле — то да, это вариант.
+
avatar
-2
  • RW9UAO
  • 26 июня 2025, 10:09
www.qorvo.com/products/p/DWM1000
башку не грей
+
avatar
0
  • AFCrio
  • 28 июня 2025, 14:09
FTM is used to measure Wi-Fi Round Trip Time (Wi-Fi RTT) which is the time a Wi-Fi signal takes to travel from a device to another device and back again.
Расстояние вычисляется по времени а не по RSSI, должно нормально работать.
+
avatar
+11
о чём тут вообще!?
+
avatar
+4
  • INN36
  • 22 июня 2025, 14:24
+
avatar
0
считаете Афтырь заслужил Шнобелевку!?
+
avatar
+2
  • INN36
  • 22 июня 2025, 14:51
Просто автор захотел выговориться.
Ничего страшного, бывает
+
avatar
+2
я не против, просто время жалко)
+
avatar
+7
  • INN36
  • 22 июня 2025, 15:18
Не стреляйте в пианиста…
А читать все это Вас вроде никто и не заставлял.;)
+
avatar
0
  • sim31r
  • 02 июля 2025, 22:14
Ну вообще-то обзор будет актутален лет 30. Периодически всплывает задача решить задачу именно на таком контроллере и по статье будет понятно как сделать быстрый старт. Я тоже иногда по какому-то датчику нахожу статьи 2014 года и там всё подробно расписано.
+
avatar
+19
перестаньте курить то, что скосили. это явно не то, что нужно курить
+
avatar
-1
Курить вредно, так то.
+
avatar
+2
  • kvarkk
  • 24 июня 2025, 08:10
— Вы полагаете, это следует бросить?
— Я полагаю, это стоит скурить.
+
avatar
+11
Эмм, а смысл всего этого в эпоху ESP? Он дороже пусть и в два раза (но разница 1$ или 2$, ИМХО, несущественна для diy), изучен вдоль и поперек, имеет нормальные спеки и с ним куча бордов, а программировать можно хоть из ардуино.
+
avatar
+6
  • CuMr
  • 22 июня 2025, 13:56
0,1 и 1 — это не в два раза…
+
avatar
+9
  • aliex
  • 22 июня 2025, 15:29
Для DIY — это не в два раза, это просто одно и то же. Я бы, правда, сказал не «esp», а «RP2040» — если именно вайфаи не нужны, он куда веселее.
+
avatar
0
RP2040 есть модули с вайваем.
+
avatar
0
за 0,1?
тут какбы именно вопрос в контроллере весьма удовлетворяющем многим потребностям за 0,1.
плюсом енергопотребление относительно всяких есп+
+
avatar
+4
  • aliex
  • 23 июня 2025, 11:27
Для DIY цена — вобще вопрос второстепенный, тем более между 0.1 и 1 баксом. Это ж не массовое производство. Что до потребления — даже esp, если вайфай не включать, жрут довольно умеренно, если, конечно, не пытаться запитать от часовой батарейки — что, опять-таки, дома смысла не имеет. В общем, в моём понимании всё это для масс продакшна, где экономят каждую долю цента, а для DIY важнее удобство, распространённость и понятность. Которых в этих штуках и близко нет.
+
avatar
+6
В первую очередь целесообразность.
Зачем искать проблемы и героически их преодолевать.
У тех кто активен может часто возникать куча задач решаемых простейшим контроллером.
Например не так давно собирал девайсину, ВСЯ работа которой была отсчитать 5минут и активировать выход. Условный блинк )
начал собирать на 555 и рассыпухе, возникли нюансы, плюнул поставил подобный проц.
Вышло проще и дешевле.
зачем мне вместо десятков модулей по 0,1 покупать десятки модулей по 2-5-10$/шт просто потому что так привычно комуто в самоделках и он не видит смысла экономить ?? А мне ради этого нужно бесполезно потратить сотни вечнозеленых…
если вам цена вопрос второстепенный, предлагаю процент с каждой вашей диайваины присылать мне. вам же все-равно, а мне будет приятно )
+
avatar
+6
  • aliex
  • 23 июня 2025, 15:24
Ну если вы по устройству раз в два дня выдаёте — может и да. Но обычно в DIY это гораздо реже происходит. Что-нибудь порядка пару штук в месяц. В итоге всякие платки имеют привычку скорее накапливаться, чем наоборот. Ну и о 5-10 никто не говорил. Вот сейчас на али вижу — на rp2040 платка $1.2, модули с esp8266 — от 1 бакса, простейшая bluepill — $1.5. Причём это готовые модули со всеми удобствами, а не лысый контроллер. А так — та же STM32F103C6T6A — $1.8 за пять штук.

Ну и у кого как, но по идее лишний час, потраченный на копание в какой-то фигне будет стоить минимум как штук 20-30 готовых понятных платок. А этот час вы на копание с новым непонятным контроллером потратите гарантированно.
+
avatar
0
Ну вон автор купил 20, потом вдогонку еще 50.
и я уверен он их применит )
нет, я не планировал покупать, у меня пока есть запас других простых распаяных. до их израсходования или специфичности задачи мне неособо интересен выбор иных.
если б я был в процесе выбора, скорее купил бы борды из топика. «зачем платить больше»©
Но, и признаю. при цене в районе бакса-полутора 2040 тоже наверное имеет неплохие шансы занять место в самоделках и у меня. мои 5 баксом — быстрый поиск который в большинстве локальное показал.
ибо есп такая себе штука. весьма специфическая. хотя и с несомненными плюсами.
+
avatar
0
  • aliex
  • 23 июня 2025, 17:12
Почти уверен, что не применит. Умеет мало, требует изготовления хоть какой-то платы… Другое дело, что если уж покупать — то проще сразу пачку, тем более за такие копейки. У меня вообще всё это скорее идёт «до кучи докинуть пяток платок, которые прямо сейчас по скидке». В итоге, правда, в основном копятся. И по ссылке в топие не борды, а голые чипы.

raspberry по баксу на али в bundle deals почти всегда висят. А есп я и сам недолюбливаю, уж больно странностей много — те же ноги в момент инициализации.
+
avatar
+1
И по ссылке в топие не борды, а голые чипы.
моя вина, повелся на картинку от автора, вследствие проблем с переадресациями сайта.
и, да. Это действительно, с моей точки зрения все СИЛЬНО меняет.
В такой ситуации я тоже выберу борду 2040 за бакс-полтора, вообще не обсуждается.
+
avatar
+3
я уверен он их применит
Ну разве что из упрямства. Давным давно я примерно также купил пару десятков штук STM8. Без плат, просто голые so8. Ну типа это ж круто — за копейки столько в них всего. Так и лежат уже лет 10 — куда проще взять какую-нибудь готовую платку и на ней быстренько сварганить то, что нужно. Пусть даже она и стоит раз в 20 дороже. Мне моё время дороже.
+
avatar
+7
если б я был в процесе выбора, скорее купил бы борды из топика. «зачем платить больше»©
Вы самое главное упускаете — надежность и глючность контроллеров. Если взять что-то известное, тот же STM (оригинал), он документирован и изучен вдоль и поперек, его надежность вопросов не вызывает. А если взять вот такой неизвестный китайский МК, про его надежность говорить очень сложно. И остается только гадать, подведет он вас или нет, а если подведет, то где.

Читал недавно статью про какие-то китайские МК (не помню), там автор убил его программно — он предположил, что в маленьком корпусе выводы просто соединены вместе, поэтому если на один вывести 0, а на другой 1, будет КЗ, которое и убьет контроллер. Вот вы хотели бы в свои проекты такое ставить? Я что-то не очень.
+
avatar
0
там автор убил его программно — он предположил, что в маленьком корпусе выводы просто соединены вместе, поэтому если на один вывести 0, а на другой 1, будет КЗ, которое и убьет контроллер. Вот вы хотели бы в свои проекты такое ставить? Я что-то не очень.
Оооо, а вы что, думаете, в STM такого нет? Давно в ERRATA не заглядывали?
Соединение выводов — это не «глючность», это особенность. Например, можно использовать для повышения тока вывода. Или если они не выведены… Не знаю, не использовать совсем? Часто у вас в проектах возникает нужда подать случайный логический уровень на неиспользуемые выводы? У меня чет за десяток лет ни разу.
+
avatar
+1
китайские МК (не помню), там автор убил его программно — он предположил, что в маленьком корпусе выводы просто соединены вместе, поэтому если на один вывести 0, а на другой 1, будет КЗ, которое и убьет контроллер. Вот вы хотели бы в свои проекты такое ставить?
Конечно да. Это шикарная возможность выполнить самоуничтожение устройства — и никто ничего не докажет.
+
avatar
+2
Эмм, а смысл всего этого в эпоху ESP?
Получить ачивку «построить дрон из одноразовых вейпов», например.
+
avatar
+4
Если захотите сделать экран на светодиодах, то это можно поставить в каждый пиксел ))
Ну, почти…

Или «засеять» газон «светлячками» с датчиками движения и питанием от микроаккума с солнечной батареей — прошелся — а за тобой шлейф света…
+
avatar
+4
С удовольствием бы использовал вместо attiny75 но «порог вхождения» высоковат.
+
avatar
0
  • Muzzy_
  • 25 июня 2025, 12:02
«порог вхождения» высоковат.
Для attiny есть поддержка в arduino.
+
avatar
+1
С удовольствием бы использовал вместо attiny75 но «порог вхождения» высоковат.
имеется ввиду что для этого придется сначала самому ее разработать и выпустить?
Или имеется ввиду другая тинька, например 85?
Во втором случае — уже активно используется в нише с низким вхождением типа Ардуины.
+
avatar
0
Поясните плз, как можно интерпретировать смысл моего коммента иначе, чем желание использовать обозреваемый чип в тех конструкциях, где используется тинька? (Понятно, что 85я, с ценой $15 за 10шт)
+
avatar
+34
  • Leoniv
  • 22 июня 2025, 13:34
Смысл мегадешевых контроллеров — это если что-то делать мегамассово и экономить каждый цент. А для DIY нет никакой разницы, или этот за 10 центов, или STM32F030 за 45 центов.
+
avatar
+7
А поиграться?
А с процессорами у меня очень хорошо — еще бы где силы найти все MSP430 выбросить. В свое время их можно было бесплатными образцами набрать — но не более 50 штук и 6 разновидностей за сутки :). У меня из столько, конечно, нет — но место все равно занимают — каждой твари по паре — и выбросить жалко.
Но времена халявы кончились — а много лет назад за домашние проекты платить вообще не приходилось, сплошные образцы.
+
avatar
+17
  • Leoniv
  • 22 июня 2025, 16:10
А поиграться?
Да, это тоже аргумент. Но под конец жизни время летит настолько быстро, что не получается успевать доделывать всё ранее задуманное. Как-то надо умудриться использовать время рационально, и тут самый главный резерв — отказаться от всех ненужных дел, типа игр с левыми контроллерами.
+
avatar
+6
а зачем доделывать всё ранее задуманное?
+
avatar
+8
  • Leoniv
  • 22 июня 2025, 18:45
Чтобы обрести душевное спокойствие. Гораздо легче отказаться от игр с новыми контроллерами, чем от давней мечты.

С другой стороны, начинать проекты и бросать их незавершенными — тоже вполне нормальная практика, она хорошо вписывается в философию радиолюбительства.
+
avatar
+1
Мне допустим игры с МК приносят душевное равновесие. Может я как то не так с ними в игры играю?
Ну и про игры. Как пример Silver Snipers — шведская киберспортивная команда по Counter-Strike, состоящая из игроков в возрасте от 62 до 81 года. Не утверждаю, что это правильно или нет. Просто факт. А что вы все время по себе остальных оцениваете?
И отказываться от мечты не стоит. Ну если природа не обделила многозадачностью.
ПыСы Картинку уже публиковал, чуть ниже )))
+
avatar
+2
  • Leoniv
  • 23 июня 2025, 16:56
Многозадачность есть, но времени на задуманное совершенно не хватает. Единственный выход — безжалостно резать все не очень важные дела.
+
avatar
0
Из моих многочисленных знакомых, времени не хватает тем, кто много суетится. Это из наблюдений и к Вам не имеет отношения. В Китае есть хорошая поговорка (оч приблизительный перевод):
Мы не хотим что бы в наши двери стучала радость, мы не хотим что бы в наши двери стучало горе, мы просто будем спокойно делать нужное и полезное дело.
ПыСы У Автора (именно с большой буквы) времени несмотря на возраст вполне хватает, возможно он просто не суетится.

И как там:
-Не бери больше чем можешь унести…
Право не стоит судить по себе, ресурс штука индивидуальная. Вы себя еще с Пушкиным сравните, по количеству сделанного и отпущенного времени. Это так, пример для понимания
+
avatar
+9
Ну тут наверное каждый для себя сам решает и расставляет приоритеты. Единого рецепта нет
А то как тут:
Тыц картинко
+
avatar
0
Так может у человека как раз и задумано поиграться с контроллерами? Всю жизнь было некогда, вот гештальт и остался?

Так-то оно конечно да, отбросить лишнее, сконцентрироваться на главном… но слишком уж это философская тема получается, слишком уж много может быть мнений… Например такое: в 2х метрах под землей нет разницы между наличием или отсутствием микроконтроллера. А потому и нет разницы, главный он или нет.
+
avatar
+5
Жму руку. Пишите еще и никого не слушайте
Со всем уважением
+
avatar
0
Робот-пылесос как-то справляется, может у него мозги позаимствовать?
+
avatar
0
он не на открытом воздухе и с прямыми солнечными лучами, это большая разница.
+
avatar
+1
Сделайте " электропастуха", как для коров. :) Подъехал, уткнулся в провод, понял что пора сворачивать.
А -а, прочитал, там так и сделано! :)
+
avatar
0
  • macau
  • 22 июня 2025, 14:44
>Но что делать с ее навигацией — так пока и не решил
Opencv?
+
avatar
+1
Вот тут ссылка один чел ещё 10 лет назад решал эти проблемы.
+
avatar
+1
так как PlusPda не позволяет никаких вложений, кроме графики, и размер текста ограничен — а исходники программатора перевалили 30 килобайт, стал думать, а как же все это обойти? Выход оказался прост — заархивировал исходники и разбил их в несколько QR кодов. Самый большой их них позволяет хранить почти 3 килобайта, заархивированные исходники заняли 4 картинки.
Тот самый случай, когда думать — вредно.
Если кому идея понравилась, ниже найдете питоновый код
Идея НЕ понравилась.
Задача решается гораздо проще — без всяких танцев с бубном вокруг питона:
cat image1.jpg something.rar > image2.jpg
или
copy /b image1.jpg+something.rar image2.jpg
На выходе получается контейнер, который читается простым WinRAR.

Что касается загрузчика — с PY32F040 он будет работать?
+
avatar
+6
  • vismyk
  • 22 июня 2025, 17:52
На выходе получается контейнер, который читается простым WinRAR
А движок PlusPda лишнее не ампутирует? :/
+
avatar
0
  • AndrVU
  • 22 июня 2025, 15:18
у каждого настоящего программиста 16 пальцев на руках — чтобы считать было легче
Восемь тоже было бы неплохо. Как у котов когтей на двух лапах (про пятый неразвитый я в курсе). Интенсивность развития цифровых технологий была бы совсем иной, но, видимо, у эволюции были другие приоритеты.
+
avatar
+6
+
avatar
+5
  • Zhora
  • 22 июня 2025, 15:26
Загрузчик лежит здесь — но скачать может быть проблемой
pastebin.com же, если github слишком сложно
+
avatar
0
  • Tundra
  • 22 июня 2025, 15:33
да не, джипег в ворд, ворд в зип, зип на флешку.
+
avatar
+6
флешку сфотографировать и выложить сюда
+
avatar
0
  • Zhora
  • 22 июня 2025, 15:42
ну или так
+
avatar
0
Уже давно существует GitFlic.ru.
+
avatar
+9
  • aliex
  • 22 июня 2025, 15:37
Респект… и недоумение. Крайне двойственное впечатление, причём дважды. Работа проделана — респект, но смысл применять непонятный контроллер вместо любого из пачки хорошо доступных и известных для самоделок непонятен совершенно. QR-коды — изобретательно, но почему не нормальный гитхаб или ещё какое вменяемое облако хотя бы?
+
avatar
+2
… но почему не нормальный гитхаб или ещё какое вменяемое облако хотя бы?
– Почему «Ы»?
- Чтоб никто не догадался
Уважение и восхищение трудом и способностями автора. И небольшое сожаление, что время, потраченное на этот проект, не было инвестировано во что-то более широко применимое, но как любят говорить у нас в стране — на каждый поезд есть свои пассажиры
+
avatar
0
  • Zhora
  • 22 июня 2025, 15:43
фазовую радиопеленгацию — за небольшие деньги точность получается метр и хуже
Триангуляцию с UWB на DW1000 — до 10 см, на 100м добивает habr.com/ru/articles/715936/
+
avatar
0
Только деньги совсем другие :(
+
avatar
0
  • Zhora
  • 24 июня 2025, 05:28
ну смотря с чем сравнивать. в 10к руб за комплект можно уложиться
+
avatar
+1
  • Latte
  • 22 июня 2025, 15:50
Натестировал 32 кбайта, на этом остановился. Интересно девки пляшут…
Виртуальное урезание ради ценовой сегментации — обычное дело. Та же F103C8 на блюпилле (оригинальная) на деле была со 128кб флеша.
+
avatar
+3
Загрузчик лежит здесь — но скачать может быть проблемой, mail.ru стал давать скачивать файл только 5 раз в день. Меркантильные кю, куда этот мир катится? За снятие ограничений рубль просят — а где я вам его возьму?
Почему не выложить на бесплатный гитхаб?
+
avatar
+11
Прочитав статью до конца, вы научитесь кодить прямо в QR-коде…
+
avatar
+1
осторожно, если моргнуть три раза — то перезагрузишься
+
avatar
0
через адаптеры последовательного порта USB

Оно же через CMSIS-DAP USB и наверно, отлаживаться сможет?
Такие мк есть и " осминожки" и у них прикольно, несколько пинов подключены к одному выводу!
+
avatar
+5
супер-пупер GPS с сантиметровой точность и дорогая, и под деревьями работать не будет. Пылесосные лидары солнечный свет плохо переносят — косить по ночам? Ну, да — «в самый жуткий час мы волшебную косим трын-траву!». Думал про фазовую радиопеленгацию — за небольшие деньги точность получается метр и хуже
на дерево лазер установите с механизмом управления. По типу нивелира. Сделаете сетку на земле. Будет киберпанково))
+
avatar
+4
Лазер помощнее и можно сразу траву косить как в обителе зла. Только соседей жалко )
+
avatar
+3
  • vismyk
  • 22 июня 2025, 18:14
Зеркальный забор по периметру и вращающийся лазер посередине! ;)
+
avatar
+9
Но что делать с ее навигацией — так пока и не решил
Вбиваете по центру газона кол. Привязываете косилку собачьим поводком(который самосматывающийся). Готово. Углы докашиваете вручную.
При особо сильном желании можно на ось вращения катушки повешать энкодер номер раз, а на сам кол экнодер номер два, таким образом получив координату косилки в радиальной системе координат с началом отсчёта непосредственно в колу. После чего можно начать выстригать фигурные фигуры, квадрат, треугольник, звезду давида…
А ещё вместо косилки можно завести козу. С ней способ с колом работает ещё лучше — вместо поводка хватит обычной верёвки
+
avatar
+1
В конце 1970 года Видлар решил уйти из компании National Semiconductor. Компания, в целях экономии, отказалась от стрижки газонов перед главным зданием… Боб решил сделать подарок компании). За $60 он купил у знакомого фермера овцу и, будучи недовольным видом заросшей поляны (где он парковал свой двухместный мерседес), пустил животное «подстригать» газон. Видлар для огласки пригласил репортера из San Jose News, который написал статью с комментарием Боба о том, как "… овца оставила без работы множество садовников, но при этом она не только может стричь, она еще и может удобрять!"

Овца была похищена ночью. Вокруг этой истории много легенд и мифов. Кто-то говорил, что Видлар сам отвез овцу и пропил ее в одном из баров, по другой версии овца и вовсе не была овцой, а являлась козой, или, что еще лучше — козлом.
+
avatar
+1
  • aliex
  • 22 июня 2025, 22:17
Сейчас один из очень «живых» подходов — козы в аренду для «стрижки» и вообще борьбы с бурьянами (да и кустами некрупными). Жрут на удивление активно и ранвомерно, в том числе там, где косить замучаешься — например, где всякие декоративные булыжники набросаны.
+
avatar
+2
С козой и колышком тоже сильно все не просто.
Смотри: www.yaplakal.com/forum2/topic1837959.html
+
avatar
0
Вбиваете по центру газона кол. Привязываете косилку собачьим поводком(который самосматывающийся). Готово. Углы докашиваете вручную.
При особо сильном желании можно на ось вращения катушки повешать энкодер номер раз, а на сам кол экнодер номер два, таким образом получив координату косилки в радиальной системе координат с началом отсчёта непосредственно в колу. После чего можно начать выстригать фигурные фигуры, квадрат, треугольник, звезду давида…
О, очередным инженерам прочитанная в детстве книжка не дает покоя. Реальные газоны они того… сложнее. Там и кочки, и деревья, и отличная от квадрата форма, для которой один круг это процентов 20.
+
avatar
+2
  • Lvenok
  • 22 июня 2025, 19:18
У Mega.nz неплохое облако
+
avatar
0
+, да и не только облако, но правда уже объём сократили, но всё равно неплохо.
+
avatar
+3
Так себе микроконтроллер. Метеостанцию не построить. )
+
avatar
+1
О, вайб-кодинг и до муськи добрался. Qwen? LLM любят комментировать каждый шаг.
+
avatar
-3
  • Par
  • 22 июня 2025, 21:25
цель статьи не понятна! И вообще зачем она здесь?
+
avatar
+4
Когда я тестировал флеш, чип смотрел на меня, как кот, который знает, где спрятал колбасу: подвох нашелся — 20 кбайт протестировалась, а он все тестирует и тестирует. Натестировал 32 кбайта, на этом остановился. Интересно девки пляшут…
Это норм. Производитель не заморачивается в производством конкретных чипов. Как правило в пределах одной серии кристалл в чипе одинаков. Но как правило все лишнее не тестируется и отбраковку не проходят.

Например это в STM32 вообще открытом текстом это говорят. Дословно: «Вы можете использовать все не документируемые блоки, но в связи с тем, что тестирование они не проходили вы делаете это на свой страх и риск».
Так что да-же на младших чипах можно найти полный объём флеша, памяти и всех функциональных блоков. Но без гарантии. Физически отключаются только блоки аппаратного шифрования. Это связано с экспортными ограничениями США.
+
avatar
0
Про stm32 этой информации как минимум 15 лет, как стал продаваться f103. Лично я знаю об этом точно более 10 лет.
И об stm32 в целом, время идет и китайцы предлагают целые линейки МК есть из чего выбирать. Вот прямо сейчас держу в руках gd32l233 (это как бы stm32l4, только с ядром m23), который сходил и купил за 80р локально для одного своего проекта, по критерию что есть в магазине рядом подешевле в корпусе на 64 вывода и небольшим потреблением, и у него заявлено и шифрование DES, TDES, AES (128, 192, 256) просто раз упоминулось шифрование. Сейчас такой выбор благодаря китайцам, я stm32 в руки уже несколько лет не брал.
+
avatar
+1
Про нормальную среду разработки.
Гугл пишет, что есть способ интегрировать компилятор Кайла и в Visual Studio, и в халявную Visual Code
Для последней:
https://marketplace.visualstudio.com/items?itemName=Arm.keil-studio-pack

Про навигацию. А что если встроить в косилку компас, плюс оптический радар, в котором модулировать лазер какой-нибудь частотой, чтобы синхронным детектированием воспользоваться.
Ну и по углам участка поставить колышки с катафотами-отражателями. С точки зрения качества, вероятно, не самый лучший метод — но для себя может сработать.
+
avatar
+1
Сила Кейла даже не в компиляторе, а в дебаггере. Поэтому приходится мириться с его ужасным редактором кода и прочими недостатками.
+
avatar
0
Но что делать с ее навигацией — так пока и не решил.
так а почему не скомбинировать логику нормальных роботов пылесосов с картами, и ограничение периметра радиозабором?
+
avatar
+5
  • orl
  • 23 июня 2025, 17:19
Кто-нибудь, расскажите автору про гитхаб
+
avatar
+2
чем же вам гитхаб то не угодил для выкладывания подобных вещей, или тот же gist если просто скрипт выложить
+
avatar
0
  • mchel
  • 24 июня 2025, 10:03
Навигацию можно сделать на ультразвуке, видел дипломную работу где в закрытом помещении сантиметровую точность получали, там по углам синхронизированные по радиоканалу излучатели стояли и один приёмник на квадрокоптере летал. На открытом воздухе тоже должно работать.
Второй вариант поставить вращающуюся камеру/массив камер на 360 градусов/камеру с объективом на 360. А по углам участка маяки, например колы с чёрно-белыми кольцами ввиде штрихкода. Или ИК маяки с уникальным кодом вспышек на каждом.
Хотя тут ещё от размеров участка зависит конечно.
+
avatar
+1
Я березы выращиваю на участке, плюс сарай и дом на том же участке. Ультразвук — это хорошо и просто, но на ровном месте.
+
avatar
0
Еще можно на основе вайфая навигацию сделать
+
avatar
0
  • Nuts_
  • 25 июня 2025, 20:25
костылей будет больше чем пользы
есть более профильные системы для этого nanoloc, UWB — и то уровень вхождения там нешуточный
+
avatar
0
Uwb под Ардуино есть
+
avatar
0
  • Muzzy_
  • 25 июня 2025, 12:05
Не надо на Израиль бочку катить. Разъёмы, по-любому, не израильские ;)
+
avatar
0
Шикарно, как всегда!
+
avatar
0
Так загрузчик там штатный есть. А свой можно было на гитхаб выложить)
+
avatar
0
А есть ещё padauk))
+
avatar
-2
  • Venmer
  • 02 июля 2025, 05:48
Вроде бы автор — мужик умный, а несет лабуду на каком-то дворовом слэнге. Уважать надо аудиторию, автор, ты не на программерских нарах сидишь.
Кстати, когда прочел, что автор пользует mail.ru в качестве лежалки файла и ещё жалится на него, то чтиво бросил и написал этот коммент. Лично мне всё стало ясно.
+
avatar
0
  • kiv69
  • 30 июля 2025, 03:15
Сначала ты набираешь этих дешёвых ништяков про запас.
Потом периодически находишь, радуешься, что такой запасливый.
Потом находишь, но выбросить рука не подымается.
Потом, спустя пару десятков лет, всё же выкидываешь в процессе борьбы с хламом.
Самое обидное, когда приходится разбирать собственноручно сделанные устройства, за давностью лет ставшие ненужными.
+
avatar
0
Раз никто до сих пор не написал, напишу. Жителям РФ данный обзор бесполезен, по причине неактуальности PY32. На али для РФ лоты с электронными компонентами сейчас скрываются, чуть в сторону от популярного и привет (фильтр именно по месту доставки), и это не обходится. И представленная ссылка в обзоре отображает как «страница не найдена» (хотя сменив локацию все отобразится). Просто поиском на али найдется только пару предложений за неадекватный ценник. И локально PY32 можно сказать не представлены в магазинах. Если задаться целью купить PY32 можно, только зачем покупать его за цену взрослых МК, которые и искать не нужно.

Актуальный дешевый МК для РФ это CH32V003. Лоты с ним есть и на али, и локально представлен, в моем случае 14р в рознице в ближайшем магазине здесь и сейчас.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.