- 2025-01-21
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】定时闹钟功能的实现
秦天qintian0303 发表于 2025-1-21 09:57
触感马达肯定是要接触的,这样最好可以弄个小电池,然后加上低功耗控制芯片
没错,要手镯类的东西,必须配小电池。其实还有另一种方案,就是将控制小型化置入触感马达内部,因为其内部是开心的。再有就是触感马达进一步小型化,甚至在其表面附加一层太阳能电池以补充能耗。
- 2025-01-20
-
发表了主题帖:
【泰坦触觉 TITAN Core开发套件】环境状态检测与触觉报警提示
在没有完全掌握以TITAN Core开发套件的硬件资源来感知环境状态的情况下,先借用ETEB-6001DPX-V1开发板的资源来检测环境的状态,并通过串口来发送指令以产生触感提示。
环境的状态信息比较多样,为此只对模拟类的信息加以处理,信息的感知则是通过相应的传感器来完成,进而输入到指定模拟信号通道来实现转换处理。
这里指定的信号源输入端为ADC0的模拟通道0,可由J2端口的SAR_A0引脚来连接,见图1所示。
本样例主要展示通过ADC0的虚拟通道0使用单端采样方式,获取模拟通道0的采样数据。
图1 通道0引脚
用于串行通讯的接口则是由端口J9的引脚1和引脚2来提供,见图2所示。
图2 串口使用引脚
有了前面的硬件准备工作,接下来就是软件的实现问题。
用于ADC初始化配置的函数为:
static void ADC_SingleSample_Config(void)
{
ADC_InitTypeDef stInit;
/* 复位ADC0,并开启该外设的时钟 */
ADC_DeInit(ADC0);
/* 校准ADC0 */
ADC_StartCalibration(ADC0);
/* 初始化ADC */
ADC_StructInit(&stInit);
stInit.virtualChannelMask = ADC_VIRTUAL_CHANNEL0;
stInit.workMode = ADC_WORK_MODE_SINGLE;
stInit.trigMode = ADC_TRIGGER_MODE_CONTINUOUS;
stInit.trigger = ADC0_TRIGGER_SRPWM_ROW0_COL0;
ADC_Init(ADC0, &stInit);
/* 将模拟通道0映射到虚拟通道0 */
ADC_ACRemapSingle(ADC0, ADC_VIRTUAL_CHANNEL0, ADC_ANALOG_CHANNEL0);
/* 使能ADC */
ADC_CoreEnable(ADC0);
/* 使能虚拟通道 */
ADC_VCEnable(ADC0, ADC_VIRTUAL_CHANNEL0);
}
实现模拟信号采集与处理的函数为:
void ADC_Test(void)
{
uint16_t u,V;
unsigned int ret=0;
while (ADC_GetVCResultStatus(ADC0, ADC_VIRTUAL_CHANNEL0) != SET);
ret = ADC_S16D2toUint(ADC_GetVCResult(ADC0, ADC_VIRTUAL_CHANNEL0));
u=ret;
if((u<3000)&&(u>=2000))
{
printf("pulse 0.5 50 0.5;");
}
if((u<2000)&&(u>1000))
{
printf("tick 0.5 50 1.0;");
}
if((u<1000)&&(u>0))
{
printf("vibrate 250 1 10 0.5 1;");
}
Write_Max7219(1,u%10);
Write_Max7219(2,(u%100)/10);
Write_Max7219(3,(u%1000)/100);
Write_Max7219(4,u/1000);
}
该函数的作用就是,对采集的数据进行判别处理,并设置了多段不同的触觉反应处理,即针对不同的检测值发出不同的触觉提示以告知紧急的程度。
为便于直观的验证,还配置了相应的数码管来显示检测值,整体的测试主程序为:
int main(void)
{
UART0_printf_init();
EVB_LEDInit();
Init_MAX7219();
Write_Max7219(1,1);
Write_Max7219(2,0);
Write_Max7219(3,0);
Write_Max7219(4,0);
Write_Max7219(5,15);
Write_Max7219(6,15);
Write_Max7219(7,15);
Write_Max7219(8,15);
Test_ADC_Init();
while (1)
{
ADC_Test();
delay(600000);
}
}
经程序的编译和下载,其测试效果如图3和图4所示。
其中图3是以火焰传感器来检测火情状况,火光越强,则检测数据值越低,发出的触摸提示就应越强烈。
用于是对模拟信号进行采集和处理,因此通过外接不同的模拟量传感器就可检测不同的外部整体,因此它具有很宽的应用范围,其通用性很强。
图3 火焰检测
图4 触觉提示指令输出
- 2025-01-19
-
回复了主题帖:
【测评入围名单(最后1批)】年终回炉:FPGA、AI、高性能MCU、书籍等65个测品邀你来~
个人信息确认无误,可以完成计划。
-
回复了主题帖:
【MCXA156开发板测评】+按键控制LED
akaz 发表于 2025-1-19 19:33
官方的板子就可以直接用案例,第三方的都得移植,毕竟硬件都会有所不同。
的确是这种情况
-
发表了主题帖:
【MCXA156开发板测评】+PWM调节功能测试
MCXA156开发板提供了PWM调节功能,利用它可实现LED灯的亮度调节。
实现功能测试的主程序为:
int main(void)
{
uint8_t duty = 0;
uint8_t idleState = 0;
uint32_t dutyCycleValue = 0;
uint32_t idleStateValue = 0;
flexio_config_t fxioUserConfig;
CLOCK_SetClockDiv(kCLOCK_DivFLEXIO0, 2u);
CLOCK_AttachClk(kFRO_HF_to_FLEXIO0);
RESET_ReleasePeripheralReset(kFLEXIO0_RST_SHIFT_RSTn);
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
FLEXIO_GetDefaultConfig(&fxioUserConfig);
FLEXIO_Init(DEMO_FLEXIO_BASEADDR, &fxioUserConfig);
PRINTF("\r\nFLEXIO_PWM demo start.\r\n");
while (1)
{
duty = 0;
dutyCycleValue = 0;
idleState = 0;
idleStateValue = 0;
PRINTF("\r\nPlease input a value (0 - 100) to set duty cycle: ");
while (duty != 0x0D)
{
duty = GETCHAR();
if ((duty >= '0') && (duty <= '9'))
{
PUTCHAR(duty);
dutyCycleValue = dutyCycleValue * 10 + (duty - 0x30U);
}
}
PRINTF("\r\nInput value is %d\r\n", dutyCycleValue);
if (dutyCycleValue > 0x64U)
{
PRINTF("Your value is output of range.\r\n");
PRINTF("Set pwm output to IDLE.\r\n");
PRINTF("\r\nPlease input pwm idle status (0 or 1): ");
while (idleState != 0x0D)
{
idleState = GETCHAR();
if ((idleState >= '0') && (idleState <= '9'))
{
PUTCHAR(idleState);
idleStateValue = idleStateValue * 10 + (idleState - 0x30U);
}
}
PRINTF("\r\nInput IDLE state value is %d\r\n", idleStateValue);
if (idleStateValue > 0x1U)
{
PRINTF("\r\nYour value is output of range.\r\n");
continue;
}
FLEXIO_SetPwmOutputToIdle(DEMO_FLEXIO_BASEADDR, DEMO_FLEXIO_TIMER_CH, idleStateValue);
#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS
PRINTF("\r\nPWM leave is: %d \r\n",
PWM_GetPwmOutputState(DEMO_FLEXIO_BASEADDR, DEMO_FLEXIO_TIMER_CH, DEMO_FLEXIO_OUTPUTPIN));
#endif
}
else
{
if (flexio_pwm_init(DEMO_FLEXIO_FREQUENCY, dutyCycleValue) == kStatus_Fail)
{
PRINTF("FLEXIO PWM initialization failed\n");
return -1;
}
PRINTF("\r\nPWM duty cycle is: %d\r\n", s_flexioGetPwmDutyCycle[DEMO_FLEXIO_TIMER_CH]);
#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS
PRINTF("\r\nPWM leave is: %d \r\n", PWM_GetPwmOutputState(DEMO_FLEXIO_BASEADDR, DEMO_FLEXIO_TIMER_CH, DEMO_FLEXIO_OUTPUTPIN));
#endif
}
}
}
该程序的功能是将PWM的工作频率设置为100KHz,占空比可通过串口从0至100自主设置。PWM脉冲的输出端为J8端口的第13号引脚,见图1所示。
图1 端口J8
经程序的编译及下载,其设置占空比的效果如图2所示。
图2 设置占空比
在连接LED模块的情况下,其调节效果如图3和图4所示。稍感不足的是,用LED模块来观察调节效果其调节范围比较窄,一般在占空比为75%至100%的期间内,否则LED就基本处于不可观察状态了。
另外,就是程序的频率调节空间有限定。本想把频率设置为50Hz,以调节占空比的方式来控制舵机,但没能成功。
图3 占空比80%
图4 占空比75%
- 2025-01-18
-
回复了主题帖:
【翌创ET6001测评】初识篇
这块板子的确不错,现在又要推出ET6002,值得期待!
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】定时闹钟功能的实现
的确是这样
- 2025-01-17
-
发表了主题帖:
【泰坦触觉 TITAN Core开发套件】定时闹钟功能的实现
本帖最后由 jinglixixi 于 2025-1-17 15:53 编辑
在不清楚开发板硬件设计的情况下,要实现定时闹钟功能的稳妥办法是用外部的开发板进行控制处理,将泰坦触觉开发套件作为振动器件来使用,两种的中间桥梁则为 串口通讯。
这里作为外部控制的是ETEB-6001DPX-V1开发板,它负责RTC计时及显示驱动等功能,显示器件为串行数码管。
数码管与开发板的连接关系为:
CLK----P2.2
DIN----P2.3
CS ----P2.4
输出高低电平的语句定义为:
#define CLK_SetLow GPIO_WritePin(GPIO2, GPIO_PIN_02, RESET)
#define CLK_SetHigh GPIO_WritePin(GPIO2, GPIO_PIN_02, SET)
#define DIN_SetLow GPIO_WritePin(GPIO2, GPIO_PIN_03, RESET)
#define DIN_SetHigh GPIO_WritePin(GPIO2, GPIO_PIN_03, SET)
#define CS_SetLow GPIO_WritePin(GPIO2, GPIO_PIN_04, RESET)
#define CS_SetHigh GPIO_WritePin(GPIO2, GPIO_PIN_04, SET)
为进行串口通讯,使用串口为 UART0,其使用的引脚如图1所示。
图1 串口使用引脚
UART0的初识化函数为:
static void UART0_printf_init(void)
{
UART_InitTypeDef init;
init.baudRate = 115200;
init.wordLength = UART_WORDLENGTH_8B;
init.stopBits = UART_STOPBITS_1;
init.parity = UART_PARITY_NONE;
init.mode = UART_MODE_NORMAL;
init.DMAMode = UART_DMA_MULTI_MODE;
init.irqEnableFlag = UART_IT_NONE;
init.hwFlowCtl = UART_HWFLOW_DISABLE;
init.TXFIFOThreshold = UART_TXFIFO_THRESHOLD_0BYTES;
init.RXFIFOThreshold = UART_RXFIFO_THRESHOLD_1BYTES;
UART_Init(UART0, &init);
}
使用的RTC初始化函数为:
static void RTC_Calendar_init(void)
{
RTC_InitTypeDef init;
rtcDatetime time;
/* set default RTC parameter */
RTC_StructInit(&init);
/* init RTC peripheral */
RTC_Init(&init);
/* set start calendar time */
time.year = 2025;
time.month =1;
time.day = 16;
time.hour = 7;
time.minute = 4;
time.second = 50;
if(RTC_SetDatetime(&time) != DRV_OK)
{
while(1);
}
/* start count */
RTC_Enable();
}
以触觉马达振动实现电子闹钟功能的主程序为:
int main(void)
{
rtcDatetime calendar;
uint8_t tick = 0;
RTC_Calendar_init();
UART0_printf_init();
EVB_LEDInit();
Init_MAX7219();
Write_Max7219(1,1);
Write_Max7219(2,0);
Write_Max7219(3,10);
Write_Max7219(4,0);
Write_Max7219(5,0);
Write_Max7219(6,10);
Write_Max7219(7,0);
Write_Max7219(8,0);
while (1)
{
/* get current date time */
RTC_GetDatetime(&calendar);
if(tick != calendar.second)
{
tick = calendar.second;
Write_Max7219(1,calendar.second%10);
Write_Max7219(2,calendar.second/10);
Write_Max7219(4,calendar.minute%10);
Write_Max7219(5,calendar.minute/10);
Write_Max7219(7,calendar.hour%10);
Write_Max7219(8,calendar.hour/10);
if((calendar.hour==7)&&(calendar.minute==5)&&(calendar.second==0))
{
printf("vibrate 150 0.5 1000 0.5 0.5;");
printf("\nCurrent time is %02d:%02d:%02d\n",calendar.hour, calendar.minute, calendar.second);
}
}
}
}
整体的电路连接如图2所示,经程序的编译与调试运行,串口的输出信息如图3所示,即在得到设置时间时,会发出控制触觉马达的振动指令。
图2 电路连接
图3 输出信息
演示视频:
[localvideo]6b49a9879853429abe7525f2c073adc9[/localvideo]
-
回复了主题帖:
【新年新挑战,任务打卡赢好礼!】第一批获奖名单公布
已确认
-
回复了主题帖:
《计算机视觉之PyTorch数字图像处理》----“目标检测与模型部署”的学习
宜城龙山 发表于 2025-1-17 09:27
《计算机视觉之PyTorch数字图像处理》相关文章介绍很详细,对学习PyTorch数字图像处理有较大的帮助
感谢支持!!!
- 2025-01-16
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】蓝牙音乐播放测试
wangerxian 发表于 2025-1-16 16:39
声音还不错,应该放在一个软的地方,声音就比较好吧。
主要是需要产生共振,用手按住要比自由跳动的音质和音量好。当然用胶粘上比较好,只是怕取下时有麻烦。
-
回复了主题帖:
新年新挑战,任务打卡赢好礼!
-
加入了学习《十天学会单片机和C语言编程》,观看 第一课(2)
-
加入了学习《十天学会单片机和C语言编程》,观看 第一课(3)
-
发表了主题帖:
【泰坦触觉 TITAN Core开发套件】蓝牙音乐播放测试
参照网页https://bbs.eeworld.com.cn/thread-1304563-1-1.html的介绍,终于复现了通过蓝牙通讯实现的音乐播放功能。
实现的方法有2种,即通过手机来控制和通过电脑来控制。
在测试前的必要准备工作是将开发板设置在蓝牙工作模式,即按图1所示来进行短接。
图1 模式设置
然后按图2所示来连接触觉马达,经测试连接触觉马达数量多,则声音强。此外,应将触觉马达粘附在纸板上以增强播放效果。
图2 连接方法
1. 电脑方式
先在电脑上搜寻蓝牙设备,见图3所示,其中VHDevice10756即是所用的开发板设备名。
图3 搜寻蓝牙设备
在进行配对连接后,其状态如图4所示。
图4 完成连接
随后,选取相应的歌曲进行播放测试,见图5所示。
图5 播放测试
演示视频:
[localvideo]c0fbdd26770a13ed86e92afc4b705cd3[/localvideo]
2.手机方式
该方式与电脑方式类似,也是先搜寻相应的蓝牙设备连接连接,然后再播放播放的歌曲以进行测试,其测试效果如图6所示。
图6 测试效果
演示视频:
[localvideo]b75df58e3031b8b42b21115a10495d90[/localvideo]
经测试,其使用方式与预想的略有差别,它是以传送数据流的方式来控制触觉马达振动发声。
当初则是设想的是,它会以蓝牙透传的方式由指令来控制开发板,那样会更便于用外部的感知体系来作出相应的处理措施,以不同的振动效果来提示使用者外部正在发生事件。
- 2025-01-14
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】原来还可以这样测
HonestQiao 发表于 2025-1-14 15:28
蓝牙的来啦:【泰坦触觉 TITAN Core开发套件】触觉马达小身材大能量:蓝牙播放,振出声音 - DIY/开源硬件 ...
好的马上去学习!
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】原来还可以这样测
HonestQiao 发表于 2025-1-13 22:25
无线指什么?
指的是蓝牙吗?
应该是蓝牙吧,也没说其设备是啥,无法确定和谁连。
- 2025-01-13
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】原来还可以这样测
HonestQiao 发表于 2025-1-13 18:11
那个跳线帽很神奇的,左跳右跳,跳与不跳,能够激活多种不同的玩法。
无线那个咋搞定呀?
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】找回串口及功能测试
HonestQiao 发表于 2025-1-13 18:09
无巧不成书。
一定是经验丰富,才能这么巧的解决这个问题。
过奖了!!!
-
发表了主题帖:
【MCXA156开发板测评】+串口通讯及其应用
本帖最后由 jinglixixi 于 2025-1-15 22:53 编辑
MCXA156开发板提供了串口通讯功能,利用它可实现数据的收发及串口设备的控制。
进行数据发送的函数为:
status_t LPUART_WriteBlocking(LPUART_Type *base, const uint8_t *data, size_t length)
{
assert(NULL != data);
const uint8_t *dataAddress = data;
size_t transferSize = length;
#if UART_RETRY_TIMES
uint32_t waitTimes;
#endif
while (0U != transferSize)
{
#if UART_RETRY_TIMES
waitTimes = UART_RETRY_TIMES;
while ((0U == (base->STAT & LPUART_STAT_TDRE_MASK)) && (0U != --waitTimes))
#else
while (0U == (base->STAT & LPUART_STAT_TDRE_MASK))
#endif
{
}
#if UART_RETRY_TIMES
if (0U == waitTimes)
{
return kStatus_LPUART_Timeout;
}
#endif
base->DATA = *(dataAddress);
dataAddress++;
transferSize--;
}
#if UART_RETRY_TIMES
waitTimes = UART_RETRY_TIMES;
while ((0U == (base->STAT & LPUART_STAT_TC_MASK)) && (0U != --waitTimes))
#else
while (0U == (base->STAT & LPUART_STAT_TC_MASK))
#endif
{
}
#if UART_RETRY_TIMES
if (0U == waitTimes)
{
return kStatus_LPUART_Timeout;
}
#endif
return kStatus_Success;
}
实现串口0收发功能测试的主程序为:
int main(void)
{
uint8_t ch;
lpuart_config_t config;
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
LPUART_GetDefaultConfig(&config);
config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
config.enableTx = true;
config.enableRx = true;
LPUART_Init(DEMO_LPUART, &config, DEMO_LPUART_CLK_FREQ);
LPUART_WriteBlocking(DEMO_LPUART, txbuff, sizeof(txbuff) - 1);
while (1)
{
LPUART_ReadBlocking(DEMO_LPUART, &ch, 1);
LPUART_WriteBlocking(DEMO_LPUART, &ch, 1);
}
}
该程序的功能为以115200的波特率进行收发测试,每接收一个字节的数据就原样进行回馈性发送。
在使用串口调试工具的情况下,其测试效果如图1所示,由此可见收发内容完全一致,可用来字节数据的传送。
图1 收发测试
将波特率设为9600bps的情况下,则可控制MP3语音模块的播放,其控制指令是存放在数组中,即:
uint8_t cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 00, 00, 01, 0xFE, 0xF7, 0XEF};
在注销掉接收语句后,将发送语句改为:
LPUART_WriteBlocking(DEMO_LPUART, cmd3, 10);
这样,就可实现对MP3语音模块的播放控制。
修改后的主程序为:
int main(void)
{
uint8_t ch;
uint8_t cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 00, 00, 01, 0xFE, 0xF7, 0XEF};
lpuart_config_t config;
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
LPUART_GetDefaultConfig(&config);
config.baudRate_Bps = 9600U;
config.enableTx = true;
config.enableRx = true;
LPUART_Init(DEMO_LPUART, &config, DEMO_LPUART_CLK_FREQ);
LPUART_WriteBlocking(DEMO_LPUART, cmd3, 10);
while (1);
}
经测试,其效果如图2所示。
图2 控制测试
此外,由于开发板具有PWM调节功能,本打算用来进行云台控制,可很难设置到双轴云台的工作频率。为此,改为用带串口控制功能的PWM模块来实现。
该模块是通过串口来接收控制指令,以控制2个通道的PWM输出。在连接舵机的情况下,可顺利地实现双轴云台的调节控制。
该模块工作的通讯波特率为9600bps,舵机工作的频率为 50Hz。
为便于调节控制,是将指令存放于指令数组中,其格式为:
uint8_t MLF[7]={'S','1','F','0','5','0','T'};
uint8_t MLP[7]={'S','1','D','0','0','4','T'};
其中,数组MLF[]用于存放工作频率的设置指令,数组MLP[]则用于存放转动角度的设置指令。
指令中S1用于指定通道1的参数,S21用于指定通道2的参数。
在特定的连接情况下,通道1是控制云台的上下俯仰角度,通道2是控制云台在水平上的旋转角度。
由于所用的串口0是供虚拟串口来使用的,要进行使用必须通过迷你型的调试口J24来引出。
图3 所用接口
在完成整体电路连接的情况下,其调节效果如图4和图5所示。
图4 姿态1
图5 姿态2
以触摸ISP按键调节舵机角度为例,设置工作频率的语句为:
LPUART_WriteBlocking(DEMO_LPUART, MLF, 7);
实现按键调节舵机角度的程序为:
i=3;
while(1)
{
if ((GPIO_PinRead(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN))==0)
{
MLP[4]=i/10+'0';
MLP[5]=i%10+'0';
LPUART_WriteBlocking(DEMO_LPUART, MLP, 7);
delay_2();
i=(i+1)%13;
if(i==0) i=3;
while (((GPIO_PinRead(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN))==0));
}
}
图6 串口引脚分配