土斯 发布的文章

kicad 视频教程

1-KiCad-9分钟学会绘制原理图.mp4
10-KiCad-9分钟学会层次图与设计规则.mp4
11-KiCad-9分钟学会圆形覆铜+禁止覆铜+批量地过孔.mp4
12-KiCad-9分钟学会封装自动排列和批量选择与编辑.mp4
2-KiCad-9分钟学会绘制PCB.mp4
3-KiCad-9分钟学会出Gerber文件.mp4
4-KiCad-9分钟学会安装使用插件.mp4
5-KiCad-9分钟学会编辑符号库.mp4
6-Kicad-9分钟学会封装向导.mp4
7-kiCad-9分钟学会手工创建封装.mp4
8-KiCad-9分钟学会弧线和微带线过孔.mp4
9-KiCad-9分钟学会蛇形等长布线.mp4

节约网站空间,没上传,需要的微信或qq联系索取

微信截图_20201209113315.png

节约网站空间,没上传,需要的微信或qq联系索取

做了一个物联网API 接口 可以简单快速做一个wifi 插座 或4G 开关

上传控制接口http://trtos.com/web/iot/post.php?id=test&msg={'code':667,'topic':'light1','type':'int','msg':1}
msg=消息 消息内容自定义
被控制端 访问http://trtos.com/web/iot/get.php?id=test 长连接 监听接收消息

微信截图_20201119123352.png
如下是一个测试工具
微信截图_20201119122942.png

trtos.iot.test.exe.zip

控制端的代码 如下 使用的是 air724 4g 模块使用lua 语言

sys.taskInit(function()
    while not socket.isReady() do sys.wait(1000) end
    log.info("连接上网络")
    sys.wait(2000)
    local client = socket.tcp()
    if not client then log.info("创建socket失败") end
    if not client:connect("trtos.com",80) then log.info("连接失败") end
    local data="POST /web/iot/get.php?id=test HTTP/1.1\nAccept-Language: zh-CN,zh;q=0.9\nHost:trtos.com\nConnection: keep-alive\nContent-Length:1\nContent-Type:application/x-www-form-urlencoded;charset=UTF-8\n\nn\n\n"
    if not client:send(data) then log.info("发送失败") end
    log.info("发送完成")
    while true do
        local recvstr, err = client:recv()
        log.info("接收到数据:",recvstr, err)
        sys.wait(100)
    end

实际测试不是很稳定,后面更新了心跳包,持续测试一周无掉线情况

拆了一个oid 机器人

微信图片_20201106165810.jpg
微信图片_20201106165806.jpg
微信图片_20201106165753.jpg

微信图片_20201106165757.jpg

微信图片_20201106165802.jpg

整体工艺不错,就是功能较少

世人慌慌张张,不过碎银几两

世人慌慌张张不过图碎银几两
是这碎银几两让少年染上了沧桑
是这碎银几两让憧憬增添了彷徨
是这碎银几两让世人忽视了月光
偏这碎银几两可解世间惆怅
偏这碎银几两可保父母安康
偏这碎银几两可护幼子成长
即便碎银千万两百年阳寿终殆尽难逃最终黄土躺
何必只顾碎银几两在世间挣扎迷茫
尚可恣意猖狂避开人来人往等最终黄土一躺
只是这黄土一躺还需那碎银几两怅惘碎银几两
勿误皎皎月光暮年白发苍苍
尚存年少轻狂一抔黄土来躺
终享从容安详几两碎银在旁
只证奔波繁忙满地月光入葬
仍伴来世过往
u=1162059172,998633463&fm=173&app=25&f=JPEG.jpg

docker 创建容器 启动 ssh 映射 端口 设置名字

docker run -d -p 5222:22 -p 5280:80 -p 8554:8554 -p 8555:8555 -p 8556:8556 -p 8557:8557 -p 8558:8558 -p 8559:8559 --name test1 -v G:\docker:/home/tom my_ubuntu_18 /usr/sbin/sshd -D

提交容器为镜像docker commit 8ba6903ab069 my_ubuntu_18
导出镜像 docker save -o my_ubuntu_18.tar my_ubuntu_18
导出容器 docker export -o 8ba6903ab069.tar 8ba6903ab069

esp32 中英文语音合成

  • 环境搭建

使用资源

Esp idf https://github.com/espressif/esp-idf.git
中文合成https://github.com/espressif/esp-skainet.git
英文合成https://github.com/s-macke/SAM

WIN 平台下 默认的 语音依赖文件无法通过脚本烧录

整理出一个可以的命令行指令
python.exe G:\PRJ\esp32\esp-idf\components\esptool_py\esptool\esptool.py --chip esp32 --port COM8 --baud 115200 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x100000 G:\PRJ\esp32\esp-skainet\components\esp-tts\esp_tts_chinese\esp_tts_voice_data_xiaole.dat

4M Flash分区表 partitions.csv

Espressif ESP32 Partition Table

Name, Type, SubType, Offset, Size

factory, app, factory, 0x010000, 0x090000
voice_data, data, fat, 0x100000, 0x300000

中文合成 必须依赖项,具体暂不清楚
中文合成sd_card_mount("/sdcard");

中文合成例子
//初始化中文语音合成
esp_tts_handle_t * zh_init() {

const esp_partition_t* part=esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, "voice_data");//寻找语音合成所需数据分区
if (part==0) { 
    printf("Couldn't find voice data partition!\n"); 
    return 0;
}
spi_flash_mmap_handle_t mmap;
uint16_t* voicedata;
esp_err_t err=esp_partition_mmap(part, 0, 3*1024*1024, SPI_FLASH_MMAP_DATA, (const void**)&voicedata, &mmap);//根据分区表加载对应数据
if (err != ESP_OK) {
    printf("Couldn't map voice data partition!\n"); 
    return 0;
}
esp_tts_voice_t *voice=esp_tts_voice_set_init(&esp_tts_voice_template, voicedata); //合成语音所需数据初始化
esp_tts_handle_t *tts_handle=esp_tts_create(voice);//创建一个合成语音对象
return tts_handle;

}
//合成并播放中文语音
void play_zh(esp_tts_handle_t tts_handle,char prompt1) {

if (esp_tts_parse_chinese(tts_handle, prompt1)) {
        int len[1]={0};
        do {
            short *pcm_data=esp_tts_stream_play(tts_handle, len, 4);   
            iot_dac_audio_play(pcm_data, len[0]*2, portMAX_DELAY);
            printf("pcm_data=%x\n", pcm_data[0]);
            printf("len=%d\n", len[0]);
        } while(len[0]>0);
        i2s_zero_dma_buffer(0);
}

}
//应用

int app_main() {
    codec_init(); //解码器初始化
    sd_card_mount("/sdcard");//挂载SD卡
    i2s_set_sample_rates(0, 8000);//设置
    esp_tts_handle_t *tts_handle;
    tts_handle=Zh_init();
    play_zh(tts_handle,"欢迎");
    i2s_set_sample_rates(0, 13050);//设置i2s播放速率
    return 0;
}

英文合成例子

void play_en(char *text) {
    sam_main(text);
    int bufferpos = GetBufferLength();
    char *buffer = GetBuffer();
    short pcm_dat[512];
    int len = bufferpos/512/50;
    for(int i=0; i<len; i++)
    {
        
        for(int n=0;n<512;n++)pcm_dat[n]=buffer[n+i*512]*0x60;
        iot_dac_audio_play(pcm_dat, 512*2, portMAX_DELAY);
    }
    i2s_zero_dma_buffer(0);
    free(buffer);
}

应用

int app_main() {
    codec_init(); 
    sd_card_mount("/sdcard");
    i2s_set_sample_rates(0, 13050);
    play_en("hello world");
    return 0;
}

微信截图_20200813105930.png

逆向了一个k210板

1595757186391.jpeg

1595757190304.jpeg

1595757204755.jpeg