Зависает arduino nano
- Войдите на сайт для отправки комментариев
Пт, 23/01/2015 - 19:10
Доброго времени суток!
используя nrf24l01 отправляю запросы о состоянии "ножки" на МК arduino nano, каждые 3 секунды. примерно после 20 минут, 2-ой МК зависает и престает отвечать на запросы, думал с переполнение serial, отключил, но все равно зависает, подскажите пожалуйста, в чем может быть дело:
/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. */ /* Hack.lenotta.com Modified code of Getting Started RF24 Library It will switch a relay on if receive a message with text 1, turn it off otherwise. Edo */ #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "printf.h" int relay1 = 8; int relay2 = 7; // // Hardware conf // // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 RF24 radio(9,10); // // Topology // // Radio pipe addresses for the 2 nodes to communicate. const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; char * convertNumberIntoArray(unsigned short number, unsigned short length) { char * arr = (char *) malloc(length * sizeof(char)), * curr = arr; do { *curr++ = number % 10; number /= 10; } while (number != 0); return arr; } unsigned short getId(char * rawMessage, unsigned short length){ unsigned short i = 0; unsigned short id = 0; for( i=1; i< length; i++){ id += rawMessage[i]*pow( 10, i-1 ); } return id; } unsigned short getMessage( char * rawMessage){ unsigned short message = rawMessage[0]; return (unsigned short)message; } unsigned short getLength( unsigned int rudeMessage){ unsigned short length = (unsigned short)(log10((float)rudeMessage)) + 1; return length; } void setup(void) { // // Print preamble // //Serial.begin(57600); pinMode(relay1, OUTPUT); digitalWrite(relay1, HIGH); pinMode(relay2, OUTPUT); digitalWrite(relay2, HIGH); //printf_begin(); //printf("\nRemote Switch Arduino\n\r"); // // Setup and configure rf radio // radio.begin(); // radio.setAutoAck(1); // Ensure autoACK is enabled radio.setRetries(15,15); radio.setDataRate(RF24_2MBPS); radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1,pipes[0]); radio.startListening(); //radio.printDetails(); } int getState(unsigned short pin){ boolean state = digitalRead(pin); return state == true ? 0 : 1; } void doAction(unsigned short id, unsigned short action){ if( action == 0 ){ digitalWrite(id, HIGH); }else{ digitalWrite(id, LOW); } } void sendCallback(unsigned short callback){ // First, stop listening so we can talk radio.stopListening(); // Send the final one back. radio.write( &callback, sizeof(unsigned short) ); //printf("Sent response.\n\r"); // Now, resume listening so we catch the next packets. radio.startListening(); } void performAction(unsigned short rawMessage){ unsigned short action, id, length, callback; char * castedMessage; length = getLength(rawMessage); castedMessage = convertNumberIntoArray(rawMessage, length); action = getMessage(castedMessage); id = getId(castedMessage, length); if (action == 0 || action ==1){ callback = action; doAction(id, action); }else if(action == 2){ callback = getState(id); } sendCallback(callback); } void loop(void) { // if there is data ready if ( radio.available() ) { // Dump the payloads until we've gotten everything unsigned short message; bool done; // char * new; unsigned short rawMessage; done = false; while ( radio.available() ) { // Fetch the payload, and see if this was the last one. radio.read( &rawMessage, sizeof(unsigned long) ); // Spew it //printf("Got message %d...",rawMessage); performAction(rawMessage); //delay(2); Serial.flush(); } } }
1. Кросспост это нехорошо.
2. Может поможет, если перевести на библиотеку MIRF.
Из любопытства: а что оно посылает назад? И как в посылке обозначены включения релюх? Другими словами - протокол в студию.
IMNSHO, стримы, трубы, callback какой-то... По-мне, этот скетч слишком прост, чтобы устраивать себе такой ад.
с первого МК отправляется "2", запрашивая состояние пина, второй МК в свою очередь посылает исключительно либо "0" либо "1" этим и обозначены включения релюх, если 0 значит выключено, если 1 включено соответственно
Оба? Всмысле 00 обе выкл, 10 первая вкл вторая выкл, или тупо 0 1?
И что вызывает doAction? Первый МК может прислать команду, типа включи вторую релюху, или он только посылает цифру 2, спрашивая состояние?
С первого МК можно включить и выключить оба канала релюхи и запросить состояния обоих (по отдельности):
команда remote -m 71 включает на втором МК канал реле №1 (пин 7)
команда remote -m 81 включает на втором МК канал реле №1 (пин 8)
команда remote -m 72 получает со второго МК состояние канала реле №1 (1 - если включен, 0 - если выключен)
команда remote -m 82 получает со второго МК состояние канала реле №2 (1 - если включен, 0 - если выключен)
Далее код с первого МК:
Предлагаю так:
Передатчик (тот кто спрашивает и включает/выключает):
Приёмник:
Останется только прикрутить работу с командной строкой, т. к. я в этом не соображаю.
Библиотека
Чтобы трансивер передавал на максимальной мощности, с максимальной чувствительностью на 250 кбит/с, надо сделать Mirf.configRegister(0x06, 0b00100110); после Mirf.config();
Скажите, а это библиотека разве будет работать на Raspberry Pi, потомучто первый МК это это он, а второй МК Arduino Nano а общаются они через nrf24l01
Версия для RPi.
Но вообще по-идее можно ничего там не менять, т. к. висла именно нано. Ей лишь нужно посылать то чего от неё ждут циклы клиента. Без разницы каким способом и какой библиотекой. Главное чтобы настройка совпадала - канал, адреса, скорость, размер посылки. Если длина посылки у Raspberry неизвестна - выяснить.
UPD
А, ну и фраза radio.read( &rawMessage, sizeof(unsigned long) ); какбе намекает на payload=4
Большое спасибо! значит, Вы думаете, что дело в библиотеке для arduino? что она зависает
Как вариант. Гадаю т. к. не приходилось крутить. Мне понятнее Mirf.
Другие факторы - аппаратные. Типа нету диода поперёк обмотки реле. Но от таких вещей ардуина обычно сбрасывается. А у вас если не было такого что 10-20 секунд тупка а потом работа восстанавливается, значит проблема программная.
еще раз спасибо, попробую, отпишусь