Caida de tension en las salidas

Hola, tengo un pequeño problema para configurar los pines del Mega como salidas.

Tengo definidas las salidas con un arrays y en teoría activo la resistencia interna del micro pull up con un bucle for, pero cuando conecto un relé a la salida la tensión cae y no me activa el relé. Si lo hago individual mente, es decir, con el pinMode y digitalWrite pin a pin, si funciona.

Me podéis ayudar, que estoy haciendo mal.
Un saludo.

// Block array
//
#include <Servo.h>  
//
//---------------------------- crear el control del servo 
Servo myservo207; 
Servo myservo206; 
Servo myservo205;
Servo myservo204;
Servo myservoprueba;
//
//----------------------------  Posicion de inico de los servos
//
int pos206 = 90;                 
int pos207 = 85;
int pos205 = 71;   // final 90 gira izq a derec. el espadi al contrario
int pos204 = 52;   // final 70
int posprueba = 90;

//------------------------------    Posicion del espadin
int posicion206 = 0;             // posicion del desvio
int posicion207 = 0;             // 0 = desvio, 1= recto
int posicion205 = 0;
int posicion204 = 0;
int posicionprueba = 0;
     
int CTRSERVO = 0;
int x = 0;
//
//-------------------------------- Arrays 
int Block[] = {22,24,26,28,30,32,34,36,48};                     // Salidas
int SEN[] =   {23,25,27,29,31,33,35,49,50,51,52,53,37.39};      // Entradas 

int buttonsen[14];
int ctrsen[14];
int isen;                     // indice sensores
int iblock;
int item;
int imillis;
long time [4];
long velocidad [] = {150,150,150,150,150};               /*   Ajustamos la velocidad del servo 150
                                                              NO puede ser menor de 100 es una constante
                                                              de la sentencia del retardo  */

//---------------------------------------------     

int CTRBLOCK8 = 1;
int prueba = 47;
int inicio =0;
int tiempo=2000;

void setup() {
//---------------------------------------------  ENTRADA SEÑAL SERVOS y POSCIONAMIENTO
 myservoprueba.attach(2);
 myservo207.attach(8);             
 myservo206.attach(9 );  
 myservo205.attach(10);
 myservo204.attach(11);
 
 myservoprueba.attach(posprueba);
 myservo204.write(pos204); 
 myservo205.write(pos205);
 myservo206.write(pos206);
 myservo207.write(pos207);
//-------------------------------------------------------------------------------------- 
 pinMode(prueba, OUTPUT);
 
  
  for (isen = 0; isen < 14; isen++)           // inicializar las arrays
      {
       buttonsen[isen] = 0; 
       ctrsen[isen] = 0; 
       pinMode(SEN[isen], INPUT);
       digitalWrite(SEN[isen],HIGH);          //Activar resistencia Pullup
      }
   for (iblock = 0; iblock < 9; iblock++)     // inicializar los block, se activan con cero 
      {
       Block[iblock] = 1; 
       pinMode (Block[iblock], OUTPUT);
       digitalWrite(Block[iblock],HIGH);          //Activar resistencia Pullup
      }
   for (item = 0; item < 5; item++)     // inicializar el temporizador
      {
       time [item] = 0;
       velocidad [item] = 150;
      }
 }   
void loop(){
 
//-----------------------------------  // INICIO
if (inicio ==0 ){
   delay (tiempo);
   digitalWrite(Block[8],HIGH);        // Activamos el rele de alimentacion de los servos
   inicio = 1;
   }
//-----------------------------------  // lectura de sensores

en lugar de esto

pinMode(SEN[isen], INPUT);
       digitalWrite(SEN[isen],HIGH);          //Activar resistencia Pullup

usa esto

pinMode(SEN[isen], INPUT_PULLUP);

Si defines el pin como salida, pretendes que ademas sea PULL-UP?

Cito la definición del PLAYROUND sobre los pines definidos como salida.

Properties of Pins Configured as OUTPUT

Pins configured as OUTPUT with pinMode() are said to be in a low-impedance state. This means that they can provide a substantial amount of current to other circuits. Atmega pins can source (provide positive current) or sink (provide negative current) up to 40 mA (milliamps) of current to other devices/circuits. This is enough current to brightly light up an LED (don't forget the series resistor), or run many sensors, for example, but not enough current to run most relays, solenoids, or motors.

Los pines configurados como SALIDAS con pinMode() se dice que estan en estado de baja impedancia. Esto significa que pueden suministrar una cantidad de corriente sustancial a otros circuitos. Los pines Atmega pueden entregar (proveen corriente positiva) o drenar hasta 40 mA (miliamperes) a otros dispotivos/circuitos. Es suficiente corriente para iluminar con mucho brillo un LED (no olviden el resistor serie), o comandar varios sensores, por ejemplo, pero no lo suficiente para la mayoría de los reles, solenoides o motores.

Gracias surbyte.
Modificaré esa linea con la tuya pinMode(SEN[isen], INPUT_PULLUP);

Respecto a la salida si quiero utilizar el PULL UP, por algun motivo no se activa correctamente el pinMode ó el digitalWrite en el bucle for, ya que si lo hago individualmente si me funciona.

Un saludo.

La primera hace lo mismo que la tuya, o sea, tus entradas configuradas como PULL UP interno estan bien.
El tema es que la salidas no puedes configurarlas como pull up. SI necesitas pull up, usa un resistor externo.

Cuando dices que lo haces individualmente y funciona a que te refieres, a esto

  pinMode(2, OUTPUT);
  digitaWrite(2, HIGH);

esto define el pin 2 como salida y luego pone en 1 esa salida, nada mas, lo mismo si le dices

digitaWrite(2, LOW);

Hola, efectivamente asi funciona perfectamente.

A[ final el problema estaba en esta sentencia :

 for (iblock = 0; iblock < 9; iblock++)     // inicializar los block, se activan con cero 
      {
       Block[iblock] = 1;                               // MAL
       pinMode (Block[iblock], OUTPUT);
       digitalWrite(Block[iblock],HIGH);          //Activar resistencia Pullup
      }

En Block[iblock] = 1; al quitarla empezo a funcionar correctamente.
No entiendo mucho el motivo, el nivel HIGH y 1 entiendo que es lo
mismo.
Realmente no vale para nada, ya que activo en la siguiente linea la salida como HIGH.
Se me colo ya que algo parecido había eso en el anterior for pero no eran salidas.

Muchas gracias, por la informacion y si me podeís decir si es lo mismo un 1 y HIGH
como un valor de salida.

Un saludo.
Brawa

1, true y HIGH son lo mismo
0, false y LOW son lo mismo

Muchas gracias, surbyte.
El problema al final, que no me he dado cuenta es, que siempre activo la salida del pin 1 ya que
le estoy asignando siempre con Block[iblock] = 1; , y no asigno ni las salidas a los otros pines ni el pinMode tampoco.

Un saludo,

Eso esta mal, debería ser asi

for (iblock = 0; iblock < 9; iblock++)  {   // inicializar los block, se activan con cero 
    pinMode (Block[iblock], OUTPUT);
    digitalWrite(Block[iblock],HIGH);          //Inicializo en HIGH, 1
}

Muchas gracias surbyte, así lo haré.
Un saludo.