站内搜索
发作品签到
标准版

【ART-Pi】4G通信扩展板 — 674182A

工程标签

8.3k
0
0
2

简介

该项目基于RT-Thread的ART-PI开发板为主控,使用合宙公司的Air724UG CAT.1模块为扩展通模块,可实现产品的4G连网服务

简介:该项目基于RT-Thread的ART-PI开发板为主控,使用合宙公司的Air724UG CAT.1模块为扩展通模块,可实现产品的4G连网服务

开源协议

创建时间:2021-01-12 09:19:37更新时间:2021-12-24 18:20:37

描述

一、原理图及PCB
 
1、电源 :由于CAT.1模块发送数据时瞬间消耗功率校大,电源模块必须考虑输出功率,由于我的输入电压是5V,模块供电是4V,我选用了MIC29302 LDO。
image.png
2、串口通信:Air724模块串口通信电平为1.8V,而H750 的GPIO电平为3.3V,两者不能直接连接需使用电平转换电路,市面上有很多电平转换IC,由于我设计的电路只有一组串口连接,成品电平转换IC都是8路,避免浪费我使用了三级管钳位和二级管单向导通原理做了电平转换
image.png
 
3、Air724固件下载:Air724官方提供了多种固件(AT, DTU、二次开发),用户可根据需求下载相应的固件,官方推荐的方式为USB下载方式,USB下载时需将UBOOT管脚拉高后重启方可进入下载模式,设计电路时务必预留UBOOT按钮及USB通讯电路。当然也可通过飞线下载,我这个主要用于学习使用,所有该引出来的就引出来了。
image.pngimage.png
 
4、开机按键:模块出厂时的固件断电或关机后,需拉低POWER_KEY 3S以上,方可开机(开机方式因固件版本有所差异,本次使用的DTU固件上电即开机)
image.png
 
5、SHT30温湿度模:块为方便网络通讯的调试,板载了一路STH30温湿度探头,可用于提供上报动态数据
image.png
 6、ART-PI  GIPIO分配
     Air724 模块串口通讯   4G_UART_RX_PIN-------------PA9"               4G_UART_TX_PIN ----------------PA10
     SHT30 I2C通讯            SHT30_SDA -------------------- PH9             SHT30_SCL--------------------------PH10
 
7、关于PCB :  布局时由于没考虑到4G模块发热情况,SHT30放的位置离模块过近,造成SHT30上电一段时间后采集温度偏高,后期有其它小伙伴做温度检测电路电一定要考虑周围器件的发热情况。
    image.png
 
二、ART_Pi程序的开发
        1、创建工程
                工程创建请参考该链接文档,此处不再赘述:
        2、外设的配置
                4G模块使用了串口1通讯
image.png
        SHT30模块使用了I2C通讯
image.png
3、获取驱动包
        本次案例将使用JSON数据格式发送数据,需使能cJSON解析器
image.png
        使用SHT30驱动包
image.png
 
4、主要程序代码
 

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-03-28     ZYH       the first version
 */

/*
 * Copyright (c) 2006-2020, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-01-24     ZYH       the first version
 */

 

#include <rtthread.h>
#include <rtdevice.h>
#include "cJSON.h"
#include "string.h"
#include "stdio.h"
#include "swap.h"
#include "drv_common.h"


ALIGN(RT_ALIGN_SIZE)
static char dtu_stack[1024];
static struct rt_thread dtu_thread;

/* mailbox control block */
struct rt_mailbox dtu_mb;

#define LED_PIN GET_PIN(H, 8)

/* memory pool for mails storage */
static char mb_pool[128];


#define DTU_UART_NAME       "uart1"      /* cat.1 dtu serial */

static struct rt_semaphore rx_sem;
static rt_device_t serial;

uint8_t LED_STA = 0;
uint8_t rx[100];

static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    rt_sem_release(&rx_sem);

    return RT_EOK;
}

static rt_err_t uart_putchar(char *ch, uint16_t length)
{
    rt_device_write(serial, 0, ch, length);

    return RT_EOK;
}


int dtu_init(void)
{
    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;

    config.baud_rate = 115200;

    serial = rt_device_find(DTU_UART_NAME);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", DTU_UART_NAME);
        return RT_ERROR;
    }

    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);

    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);

    rt_device_control(serial,RT_DEVICE_CTRL_CONFIG,&config);

    rt_device_set_rx_indicate(serial, uart_input);

    return RT_EOK;
}


uint8_t get_uart_ch(uint8_t* ch)
{
    if(rt_sem_take(&rx_sem, RT_WAITING_NO) != RT_EOK)
        return 0;

    /* 读取 1 字节数据 */
    if(rt_device_read(serial, 0, ch, 1) == 1)
    {
        /* 读取到数据 */
        return 1;
    }
    return 0;
}


void PacketParser(char* json_string)
{
    cJSON* cjson=cJSON_Parse(json_string);
    cJSON* cjson_value=NULL;
    char* value = NULL;


    if(cjson != NULL)
    {
        value = cJSON_GetObjectItem(cjson,"value")->valuestring;
        cjson_value = cJSON_Parse(value);
        if(cjson_value != NULL)
        {
            LED_STA = cJSON_GetObjectItem(cjson,"value")->valueint;
        }
    }
    rt_pin_write(LED_PIN, LED_STA);
    cJSON_Delete(cjson);
    cJSON_Delete(cjson_value);
}


void create_rt_json(float temperature, float humidity)
{
    cJSON *root;
    char* str=NULL;

    root =cJSON_CreateObject();

    cJSON_AddStringToObject(root,"request","ReportTH");

    sprintf(str,"%.1f",temperature);
    cJSON_AddStringToObject(root,"temperature",str);

    sprintf(str,"%.1f",humidity);
    cJSON_AddStringToObject(root,"humidity", str);

    char *s=cJSON_Print(root);
    rt_kprintf("%s   length: %d\n",s,strlen(s));
    uart_putchar(s,strlen(s));

    cJSON_Delete(root);

}

uint8_t dtu_ExtractPacket(void)
{
    uint8_t     ch;
    static      uint16_t timeout = 0, len = 0;


    while(1)
    {
        if(get_uart_ch(&ch))
        {
            timeout = 0;
           if(len<sizeof(rx))
           {
               rx[len++] = ch;
           }
           continue;
        }

        else if(++timeout>5)
        {
            if(len!=0)
            {
                rx[len+1] = '\0';
                PacketParser((char*)rx);
            }
            memset(rx,0,sizeof(rx));
            len = 0;
            timeout = 0;
        }
        return 0;
    }
    return 0;
}


/* timer handle */
static rt_timer_t report_timer;

/* timer #1 timeout callback function */
static void report_timeout(void *parameter)
{
    cJSON *root;

    root =cJSON_CreateObject();

    cJSON_AddStringToObject(root,"request","ReportLed");

    cJSON_AddStringToObject(root,"led",LED_STA?"ON":"OFF");

    char *s=cJSON_Print(root);
    uart_putchar(s,strlen(s));
}

/* thread #2 entry function */
static void dtu_entry(void *param)
{
    dtu_init();
    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
    struct dtu_mbt_data *mbt_data;
    while(1)
    {
        /* pend and receive mail(s) from mailbox */
        if (rt_mb_recv(&dtu_mb, (rt_ubase_t *)&mbt_data, RT_WAITING_NO) == RT_EOK)
        {
           switch(mbt_data->type)
           {
               case 0x01:
                   create_rt_json(mbt_data->data[0]/10.0, mbt_data->data[1]/10.0);
                   break;

               default:
                   break;

           }
           /* delay for 100ms */
        }
        rt_thread_mdelay(5);
        dtu_ExtractPacket();
    }
}

 

int dtu_thread_init(void)
{
    rt_err_t result;

    /* initiate a mailbox */
    result = rt_mb_init(&dtu_mb,
                        "dtu_mbt",
                        &mb_pool[0],
                        sizeof(mb_pool) / sizeof(rt_ubase_t), /* size of mails */
                        RT_IPC_FLAG_FIFO);
    if (result != RT_EOK)
    {
        rt_kprintf("init mailbox failed.\n");
        return -1;
    }

    /* create timer #1, periodic mode */
    report_timer = rt_timer_create("timer1", report_timeout,
                             RT_NULL, 1000,
                             RT_TIMER_FLAG_PERIODIC);

    /* start timer #1 */
    if (report_timer != RT_NULL)
        rt_timer_start(report_timer);

    /* create thread #2 statically */
    rt_thread_init(&dtu_thread,
                    "dtu",
                    dtu_entry,
                    RT_NULL,
                    &dtu_stack[0],
                    sizeof(dtu_stack),
                    5, 10);

    rt_thread_startup(&dtu_thread);

    return RT_EOK;
}


INIT_APP_EXPORT(dtu_thread_init);

 

完整代码请下载附件查看!!!

 
 
三、CAT.1模块DTU固件下载
        固件及下载方式请查看附件。
 
四、Air724 参数配置:DTU的参数有多种配置方式,有串口配置工具,有云配置,也可通过MCU串口发送配置,我选用的是云配置(购买AIR724模块后官方会给一个用户名及默认密码)  http://dtu.openluat.com/login/   
        1、配置数据透传串口(波特率、数据位、校验位与ART-Pi参数一致)
image.png
 
2、配置网络参数:我采用的SOCKET连接方式,当然该模块支持多种连接,可根据需要自行配置。
        注意:4G模块只能做为Client,,且本身是流量方式接入,IP为公网动态IP,连接对像必须有公网IP或是公网域名(没有公网IP推荐使用花生壳做内网映射,每月有1G的免费流量,测试用足够)
 
image.png
 
五、演示效果  (详细的演示效果请查看附件)
 
S033h5oakqWLmHtTHH8jhKxxOdkug9QTg816pgZU.png
 

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
iRTU_1.8.13_Luat_V0017_RDA8910.pac
23
2
LuaTools 上手教程-(固件下载).pdf
23
3
Luatools_v2.exe
120
4
ART-Pi_Air724DTU.zip.001
258
5
ART-Pi_Air724DTU.zip.002
251
6
ART-Pi远程控制.mp4
395
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航