bunex-industries

Bras articulé 4 axes

Piloté par ordinateur avec un logiciel écrit en Cocoa, mû par des moteurs pas-à-pas et équipé d'une nacelle caméra, ce bras devient une grue de cinéma censée offrir des mouvements de caméra fluides et reproductibles.

Je me suis lancé dans ce projet de fabrication en en voyant bien les difficultés et en pensant pouvoir m'en tirer... Mais les difficultés l'on emporté (provisoirement :-) et l'objet en l'état a trop de défauts pour pouvoir être utilisé. Je jette l'éponge :-/. Et puis il m'a valu une belle blessure à la main ce qui a achevé de me démotiver.

Le logiciel (écrit en Cocoa / Objective-C) n'est pas si mal. J'y ai combiné les facilité de sceneKit pour la manipulation du modèle 3D du bras et simplifier quelques calculs en sautant du système de coordonnées d'une jointure à un autre. J'ai par ailleurs affiné les fonctions de stream du G-Code vers GRBL, voici les 2 fonctions dédiées à cette tâche :


	
-(void)received:(NSString*)str {
    NSString * ss = str;
    BOOL command = NO;
    if ([ss isEqualToString:@"ok"]) {
        if (isRunning) {
            int toRemove = [[lengths objectAtIndex:processedUntil] intValue];
            processedUntil = processedUntil + 1;
            buffer = buffer - toRemove;
        } else {
            command = YES;
        }
    } else if (![ss isEqualToString:@"Grbl 0.9j ['$' for help]"]) {
        // response from command or error !
        command = YES;
    } else {
        // welcome message
        command = YES;
        NSLog(@"%@", ss);
    }
    if (buffer <=(100) && command==NO) {
        if (isRunning) {
            [self sendLines];
        }
    }
}



-(void)sendLines {
    if (index < lines.count) {
        NSString * dd = @"";
        full = NO;
        while(full == NO) {
            if (index < lines.count) {
                int ff = (buffer + [[lengths objectAtIndex:index] intValue]);
                if(ff <= 127) { // ajouter une ligne à ce qui va être envoyé
                    NSString * s = [lines objectAtIndex:index];
                    dd = [dd stringByAppendingString:s];
                    buffer = buffer + (int)(s.length);
                    index = index + 1;
                    
                    if (index >= lines.count) {
                        //NSLog(@">>>>>>>>>> END");
                        break;
                    }
                } else { // buffer is overloaded (while break)
                    full = YES;
                    break;
                }
            }
        }
        if (dd.length > 0) {
            //NSLog(@"%@", dd);
            [self.arduino appendToConsole:dd];
            [self.arduino writeString:dd];
        }
    } else {
        isRunning = NO;
        NSLog(@">>>>>>>>>> END");
    }
}

Quelques détails

Les degrés de liberté sont l'épaule et le coude (pour les translations de la tête) d'une part, et les deux orientations "pan" et "tilt" d'autre part (rotation de la tête). Un 5ème axe est prévu : la rotation de la base dans le plan horizontal.

Les 4 drivers de moteurs pas-à-pas sont basés sur le circuit intégré DRV8825 (2 ampères par phase max) et offrent plusieurs précision de microstepping. Ils reçoivent leurs ordres de deux Arduinos nano qui embarquent chacun GRBL 0.9.

J'ai opté pour un entraînement par tiges filetées et une construction en bois.

Mes objectifs étaient les suivants :

J'étais prêt à accepter :

Contraintes additionnelles :

Aspects logiciel :

Difficultés rencontrées :

Quelques réflexions