меню и управление прошивками на флешке

dronsoft
Offline
Зарегистрирован: 02.06.2011

 Народ подскажите как сделать меню и чбобы можно было загружать прошивки разного типа на контроллере

maksim
Offline
Зарегистрирован: 12.02.2012

Никак.

Где сделать? Какие прошивки? Откуда загружать? Зачем? ОбЪясните по нормальному, что хотите...

dronsoft
Offline
Зарегистрирован: 02.06.2011

 хочу сделать так создал прошивки для арду несколько вариантов с помощью меню выбираю для опреденного действия прошивку в контроллер скетч заливается тоесть на CD карту с пк записываю несколько вариантов а на контроллере выбираю какой скет нужен и загружаю. это нужно сделать для занятий по робото техние что то похожее как контролер "НХТ"

dronsoft
Offline
Зарегистрирован: 02.06.2011

 меню нужно для выбора скетчей на крте памяти

 

maksim
Offline
Зарегистрирован: 12.02.2012

Именно в таком виде без компа (или некого программатора) это не возможно, т.к. контроллер сам себя прошить не может.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Но можно сделать одну прошивку, в которой будет несколько вариантов работы (меню) и например при запуске МК выбирать нужный режим работы.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну и теоретически, можно из дуины сделать программатор, который будет брать прошивку с SD карты и заливать ее в другую дуину.

dronsoft
Offline
Зарегистрирован: 02.06.2011

maksim пишет:

Но можно сделать одну прошивку, в которой будет несколько вариантов работы (меню) и например при запуске МК выбирать нужный режим работы.

Этот вариант тоже устроит

подскажешь примером?

maksim
Offline
Зарегистрирован: 12.02.2012

Меню где будет отображаться? 

maksim
Offline
Зарегистрирован: 12.02.2012

Можно даже (и наверное лучше) без дисплея сделать какой либо способ выбора режима работы...

maksim
Offline
Зарегистрирован: 12.02.2012

Сколько режимов работы планируется? 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Дисплей обязателен. режимов примерно 4-6

maksim
Offline
Зарегистрирован: 12.02.2012

Просто дисплей будет занимать ноги дуины... а почему обязательно? можно ведь и без него если режимов всего 4-6... 

dronsoft
Offline
Зарегистрирован: 02.06.2011

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

 

maksim
Offline
Зарегистрирован: 12.02.2012

Какой дисплей? 

step962
Offline
Зарегистрирован: 23.05.2011

maksim пишет:

Именно в таком виде без компа (или некого программатора) это не возможно, т.к. контроллер сам себя прошить не может.

Здесь вы не правы, микроконтроллер сам себя прошить может. Для ATMega читаем AVR109 (или главы 25-26 дейташита на ATMega48/88/168/328) и узнаем, что программа, которая будет заниматься самопрошивкой, просто должна сидеть в особой области программной памяти.

И называться она будет, как правило, Bootloader/загрузчик. И только от фантазии разработчика будет зависеть, откуда будет поступать информация для прошивки.

В ардуиновском загрузчике это, например USART. Но вполне может быть и SD-карточка.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну что ж, тогда с вас пример кода.... 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 LCD 16/2 стандартный

Zaliv
Offline
Зарегистрирован: 05.03.2011

Я все равно не понял зачем городить несколько прошивок? По-моему все можно решить одной, пускай более объемной.

dronsoft
Offline
Зарегистрирован: 02.06.2011

 просто эти прошивки будут делать сами дети практические занятия

 

leshak
Offline
Зарегистрирован: 29.09.2011

Zaliv пишет:

Я все равно не понял зачем городить несколько прошивок? По-моему все можно решить одной, пускай более объемной.

Либо какой-то примитивный интерпретатор соорудить, который будет читать команды с карты и выполнять их.

Но IMHO все равно ничего не выйдет. В любом случае, мне кажется, если знаний хватает на написание бутлоадера, то человек уже знает что такое бутлоадер :) И вообщем "показать примеры" просить не будет никак. 

Мне кажется самым "простым и сердитым" вариантом - взять плату с DIP-панелькой. Прошить 6-ть микрух, и сказать детям "перетыкайте/меняйте". Если боимся что "погнуть ноги" - делаем что-то типа картритжей, с более "андивандальными разъемами".

dronsoft
Offline
Зарегистрирован: 02.06.2011

 у меня сейчас задумка собрать 10 контроллеров с lcd и sd так чтобы ребята собирали своих роботов на данном железе и могли опробовать несколько вариантов сразу а не подключая к пк чтобы залить новую прошивку

просто мне будет просче объяснять им что да как да и самому тоже легче будет потому что сам тоже тока учусь )

leshak
Offline
Зарегистрирован: 29.09.2011

dronsoft пишет:

 просто эти прошивки будут делать сами дети практические занятия

 

Тогда вообще не понятно. А чем вариант "сделать прошивку, найти ее .hex на компе, запихнуть на SD, тыкнуть в дуину, в меню выбрать", лучше чем "подсоеденить шнурок и нажать upload"?

dronsoft
Offline
Зарегистрирован: 02.06.2011

 объясню еще не много будет несколько занятий по различным вариантам прошивок потом практическое применение на роботах этих прошивок уже в автомномном варианте без использования пк тоесть выбрал прошивку прошился и робот выполняет именно то что нужно на данном этапе полигона

leshak
Offline
Зарегистрирован: 29.09.2011

dronsoft пишет:

 у меня сейчас задумка собрать 10 контроллеров с lcd и sd так чтобы ребята собирали своих роботов на данном железе и могли опробовать несколько вариантов сразу а не подключая к пк чтобы залить новую прошивку

просто мне будет просче объяснять им что да как да и самому тоже легче будет потому что сам тоже тока учусь )

И все-таки подумайте о других вариантах (какой-то свой примитивный язычок, заливать по блютусу, еще че-нить). Сделать кастомный бутлоадер или автономный программатор - совсем не для новичка задача. Да и для "знающего" повозится будет с чем. Разве что повезет "нагуглить" что-то готовое.

Что-нить типа такого: http://hackaday.com/2012/02/21/flash-an-arduino-from-an-sd-card/ не вникал, но там похоже одна дуина другую шьет именно скетчем с ІВю

step962
Offline
Зарегистрирован: 23.05.2011

maksim пишет:

Ну что ж, тогда с вас пример кода.... 

Их много разных. Наберите в Google "avr bootloader sd-card" и черпайте полной ложкой. 

Dangerous Prototypes, например, предлагает приглядеться к проекту 2boots, который и USART поддерживает, и SD. Сойдет? 

 

UPD: ссылочка на Dangerous Prototypes подправлена...

dronsoft
Offline
Зарегистрирован: 02.06.2011

 сейчас посмотрю

maksim
Offline
Зарегистрирован: 12.02.2012

step962 пишет:

maksim пишет:

Ну что ж, тогда с вас пример кода.... 

Их много разных. Наберите в Google "avr bootloader sd-card" и черпайте полной ложкой. 

Dangerous Prototypes, например, предлагает приглядеться к проекту 2boots, который и USART поддерживает, и SD. Сойдет? 

 

Как я понимаю дисплей подключить не получится и несколько прошивок по выбору не получится заливать с SDкарты...

dronsoft
Offline
Зарегистрирован: 02.06.2011

 

Dangerous Prototypes, например, предлагает приглядеться к проекту 2boots, который и USART поддерживает, и SD. Сойдет? 

 

Если честно не много не понял о чем там 

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Ну а если действительно разобраться как написать бутлоудер, то  можно это реализовать.... но согласен, был не прав, сам себя может шить.

dronsoft
Offline
Зарегистрирован: 02.06.2011

 какой вариант просче реализовать и использовать в дальнейшем тогда так поставлю вопрос

 

maksim
Offline
Зарегистрирован: 12.02.2012

В общем в вашем случае одна прошивка с различными режимами работы самый оптимальный вариант... 

maksim
Offline
Зарегистрирован: 12.02.2012

В меню подменю будут?
 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Под меню скорее всего так лучше мне кажется

 

maksim
Offline
Зарегистрирован: 12.02.2012

Если не будет подменю, то скейтч получится проще. Если режимов всего 4 - 6. то зачем подменю? Вы уже продумали как должно выглядеть меню?

maksim
Offline
Зарегистрирован: 12.02.2012

В самом простом случае можно обЪявить глобальную переменную, которая будет отвечать за режим работы

int mode;

void setup() {                
  switch(mode){
  case 1:
    setup1();
    break;

  case 2:
    setup2();
    break;

  case 3:
    setup3();
    break;
  }   
}

void loop() {
  switch(mode){
  case 1:
    loop1();
    break;

  case 2:
    loop2();
    break;

  case 3:
    loop3();
    break;
  }   
}



//--------------------- Скейтч  Blink  ------------------------

void setup1() {
  pinMode(13, OUTPUT);
}

void loop1() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}
//--------------------------------------------------------------




//------------------ Скейтч DigitalReadSerial ------------------

void setup2() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop2() {
  int sensorValue = digitalRead(2);
  Serial.println(sensorValue, DEC);
}
//--------------------------------------------------------------




//------------------ Скейтч DigitalReadSerial ------------------

const int buttonPin = 2;  
const int ledPin =  13;     

int buttonState = 0;   

void setup3() {
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT);     
}

void loop3(){
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {       
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    digitalWrite(ledPin, LOW); 
  }
}
//--------------------------------------------------------------

по аналогии делаете сколько нужно режимов, а переменную mode менять из функции обработки кнопок и дисплея. 

Кстати, а кнопки вы какие будете использовать?

dronsoft
Offline
Зарегистрирован: 02.06.2011

Вариант кнопок на одном канале с разными резисторами дабы с экономит порты на ардуино

 

maksim
Offline
Зарегистрирован: 12.02.2012

Все-таки опишите подробнее, что за робот (роботы), что от него (них) хотите и т.д. и т.п. ?

dronsoft
Offline
Зарегистрирован: 02.06.2011

езда по полосе, арена, сталкивание стаканов, лабиринт проход его, что то типо того.

maksim
Offline
Зарегистрирован: 12.02.2012

Кнопок сколько? Три?

dronsoft
Offline
Зарегистрирован: 02.06.2011

 да три

maksim
Offline
Зарегистрирован: 12.02.2012

Все таки я не очень понимаю как все это будет выглядеть...

1. Дисплей и кнопки будут нужны только для выбора режима?

2. Робота будут собирать дети?

3. Робот будет могофункциональный или собираться под конкретный режим? т.е. на нем уже будут установлены и подключены все датчики или датчики будут подключаться и устанавливаться для разных режимов?

dronsoft
Offline
Зарегистрирован: 02.06.2011

робота каркас собирать дети датчики будут к определенным пинам но у них фунционал разный на каждом режиме

maksim
Offline
Зарегистрирован: 12.02.2012

Вы ответили только на второй вопрос... 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 1 хотелось еще и текс выводить но это пока не обязательно но желательно тоесть совмещение с выбранным меню 

2 описал

3 много фунциональный

maksim
Offline
Зарегистрирован: 12.02.2012

Вот как то так можно переключать режимы

int mode = 0;

void setup() {  
  SETUP();

  switch(mode){
  case 1:
    setup1();
    break;

  case 2:
    setup2();
    break;

  case 3:
    setup3();
    break;
  }   
}

void loop() {
  switch(mode){
  case 1:
    loop1();
    break;

  case 2:
    loop2();
    break;

  case 3:
    loop3();
    break;
  }   
}


void SETUP(){
  boolean setup_end = 0;
  int button, buttonState = 0;
  while(!setup_end){
    int buttonRead = analogRead(A0);
    delay(100);
    if(buttonRead == analogRead(A0)){
      if(buttonRead > 255 && buttonRead < 511){
        button = 1;
      }
      else if(buttonRead > 511 && buttonRead < 767){
        button = 2;
      }
      else if(buttonRead > 767 && buttonRead < 1023){
        button = 3;
      }
      else{
        button = 0;
      }
    }
    if(button != buttonState){
      switch(button){
      case 1:
        mode++;
        break;

      case 2:
        mode--;
        break;

      case 3:
        setup_end = 1;
        break;
      }
      mode = constrain(mode, 0, 3);
      buttonState = button;
    }
  }
}


//--------------------- Скейтч  Blink  ------------------------

void setup1() {
  pinMode(13, OUTPUT);
}

void loop1() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}
//--------------------------------------------------------------




//------------------ Скейтч DigitalReadSerial ------------------

void setup2() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop2() {
  int sensorValue = digitalRead(2);
  Serial.println(sensorValue, DEC);
}
//--------------------------------------------------------------




//------------------ Скейтч DigitalReadSerial ------------------

const int buttonPin = 2;  
const int ledPin =  13;     

int buttonState = 0;   

void setup3() {
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT);     
}

void loop3(){
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {       
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    digitalWrite(ledPin, LOW); 
  }
}
//--------------------------------------------------------------








И теперь осталось только сделать вывод на дисплей...

Код еще не оптимизирован, могут быть ошибки... 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Спасибо. Начну прикручивать дисплей.

dronsoft
Offline
Зарегистрирован: 02.06.2011

 чет примерор куча а толку никакого 

нашел библиотеки для меню поробовал с кодом совместить но чет не то работает



#include <LiquidCrystalRus.h>
#include <OneWire.h>
#include <OneWireTempSensor.h>
#include <SubMenuItem.h>
#include <SubMenu.h>
#include <MenuItem.h>
#include <Menu.h>
//initialize menu
Menu menu = Menu(menuUsed,menuChanged); 
//initialize menuitems
 MenuItem menuItem1 = MenuItem();
 MenuItem menuItemWithSubmenu = MenuItem();
   SubMenu subMenu = SubMenu(menuChanged);
     SubMenuItem subMenuItem1 = SubMenuItem();
     SubMenuItem subMenuItem2 = SubMenuItem(); 
     SubMenuItem subMenuItem3 = SubMenuItem();
 MenuItem menuItem3 = MenuItem();
 LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
OneWireTempSensor sensors(8); 
int numdevs;
int value;
int temp;
int ledPin = 13;
int ledPin2 =  9;
int buttonPin = 10;
int buttonState = 0;
byte newChar[8] = {
  B11000,
  B11000,
  B00110,
  B01001,
  B01000,
  B01001,
  B00110,
  B00000
};

void setup(){
  {
  lcd.createChar(0, newChar); 
  lcd.begin(16, 2);  
  numdevs = sensors.getDevices();
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin2, OUTPUT);
}


 Serial.begin(9600);
 
 //configure menu
 menu.addMenuItem(menuItem1);
 menu.addMenuItem(menuItemWithSubmenu);
   menuItemWithSubmenu.addSubMenu(subMenu);
     subMenu.addSubMenuItem(subMenuItem1);
     subMenu.addSubMenuItem(subMenuItem2);
     subMenu.addSubMenuItem(subMenuItem3);
 menu.addMenuItem(menuItem3);
 
 menu.select(0);
 subMenu.select(0);
}
void loop(){
  {
  value = (int) sensors.getTempC(0);
if (value != 85)
{
    if (value < 10)
    {
      temp = value/10;
    }
    else
    {
      temp = value;
    }
if (temp>=31)
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
}
if (temp<=26)
{
  digitalWrite(ledPin, LOW);
}

if (buttonState == HIGH) {
  digitalWrite(ledPin2, HIGH); 
  }
}
  else {
    // выключаем светодиод
    digitalWrite(ledPin, LOW);
  }
lcd.setCursor(0,0);
lcd.print("Tемпература=");
lcd.setCursor(12,0);
lcd.print(temp);
lcd.setCursor(14,0);
lcd.write(0);
}
 if (Serial.available()){
   switch (Serial.read()){  
     case 'w':
       if (menu.isCurrentSubMenu()){ 
         subMenu.down(); //set index closer to 0
       }
       break;
     case 's':
       if (menu.isCurrentSubMenu()){
         subMenu.up(); //set index closer to maximum
       }
       break;
     case 'a':
       menu.down();
       break;
     case 'd':
       menu.up();
       break;
     case ' ':
       menu.use();
       break;
     case '0':
       menu.select(0);
       break;
     case '1':
       menu.select(1);
       break;
     case '2':
       menu.select(2);
       break;
   }
 }
}

void menuChanged(ItemChangeEvent event){
 Serial.println("menuChanged"); 
 if( event == &menuItem1 ){
   Serial.println("\tmenuItem1 selected"); //user feedback
 }else if( event == &menuItemWithSubmenu ){
   Serial.println("\tmenuItemWithSubmenu selected"); //user feedback
 }else if( event == &subMenuItem1 ){
   Serial.println("\tsubMenuItem1 selected"); //user feedback
 }else if( event == &subMenuItem2 ){
   Serial.println("\tsubMenuItem2 selected"); //user feedback
 }else if( event == &subMenuItem3 ){
   Serial.println("\tsubMenuItem3 selected"); //user feedback
 }else if( event == &menuItem3 ){
   Serial.println("\tmenuItem3 selected"); //user feedback
 }
}

void menuUsed(ItemUseEvent event){
 Serial.println("menuUsed"); 
 if( event == &menuItem1 ){
   Serial.println("\tmenuItem1 used"); //user feedback
 }else if( event == &subMenuItem1 ){
   Serial.println("\tsubMenuItem1 used"); //user feedback
 }else if( event == &subMenuItem2 ){
   Serial.println("\tsubMenuItem2 used"); //user feedback
 }else if( event == &subMenuItem3 ){
   Serial.println("\tsubMenuItem3 used"); //user feedback
 }else if( event == &menuItem3 ){
   Serial.println("\tmenuItem3 used"); //user feedback
 }
}

как заставить работать на дисплее и убать пока лишнее

может есть смысл попробовать всетаки начать с меню на дисплее? но вот как? не пойму 

вот кажись получилось код для дисплея своего отделил от хлама

#include <LiquidCrystalRus.h>



LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);

int numdevs;
int value;


int buttonState = 0;

void setup() {


  lcd.begin(16, 2);  

}

// This repeats while the Arduino is running
void loop() {

}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Стандартный пример "Hello Word" работает? 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 да

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 сейчас с ним колупаюсь пытаюсь меню прикрепить но чет не догоняю