17 de maig 2015

BellSmart City. Detecció de problemes


Problema 1: mecànic
Els servos que utilitzem no tenen prou força per accionar les vàlvules del circuit hidràulic, tot i els diferents sistemes mecànics multiplicadors de força dissenyats.

Problema 2: comportament
El programa sembla que funciona bé, peró hi ha un "forat" quan el sensor 1 deixa de detectar vaixell i el sensor 2 encara no el detecta (quan el vaixell està passant per sota del pont), i el semàfor es posa verd quan hauria de mantenir-se vermell.

Possibles solucions
al problema mecànic:
Buscar servos més potents (fer atenció al torque), investigar els motors pas a pas (que necessiten alimentació independent i circuits controladors específics. Massa complicat).

Passar dels circuits hidràulics i connectar directament un servo al centre de l'eix de rotació de cada tauler del pont, muntant un mecanisme de vis sens fi per aconseguir la força necessària.
Si amb aixó encara no aconseguim aixecar el pont, podem utilitzar 2 servos, un a cada extrem de l'eix (aquesta solució implica utilitzar 4 servos només per al pont i començar a plantejar l'ús de 2 plaques Arduino UNO o una Mega, perquè ens quedarem sense pins per als servos de les barreres).

Una altra solució podria ser fer un actuador lineal accionat amb un servo. La idea de Andrew Terranova (Make) amb la carcasa d'un Pritt fa bona pinta.

al problema de comportament:
Afegir una variable (que he anomenat vaixell) amb valor 1 si el sensor 1 detecta que un vaixell s'apropa al pont, i amb valor 0 quan el sensor 2 detecta que un vaixell s'allunya del pont.
Les condicions inicials de funcionament (semàfor verd, pont abaix, barreres adalt) només quan vaixell = 0.















void loop()
{
  detecta_arriva();  // detecció amb sensor 1 de vaixell que arriva 
  if (distancia_1 < vaixell_apropa) // si el vaixell ja està molt a prop del pont
  {
    accions_apropa();
    vaixell = 1;
  }
  else
  {
    if (distancia_1 < vaixell_arriva) // si es comença a detectar vaixell
    {
      accions_arriva();
    }
    else
    {
      detecta_marxa();  // detecció amb sensor 2 de vaixell que marxa
      if (distancia_2 < vaixell_marxa)
      {
        accions_marxa();
        vaixell = 0;
      }
      else
      {
        if (vaixell==0)
        {
          condicions_inicials();
        }
        //else
        //{
          //condicions_finals(); // no sé si cal
        //}
      }
    }
  }

Cap comentari:

Publica un comentari a l'entrada