Bon déjà c'est une "bonne" nouvelle, on sait qu'on accède pas correctement aux animations.
Reste à corriger ça!
N'ayant pas pu encore testé (même si je désespère pas de le faire), ça m'embête de te donner des bouts de codes qui ne marchent pas, mais bon je tente une dernière chose, à voir si ça passe 
Si tu ne comprends pas ce que j'explique là, c'est normal, je le fais pour potentiellement d'autres developpeurs qui pourront alors corriger si besoin est mes propositions. Si tu veux voir ce que je propose saute une 20aine de lignes, tu auras le bout de code modifié (remplacement de ppm_read_byte_near) 
Donc le problème vient je pense du fait que les animations sont des tableaux à 2 dimensions, ce qui peut être vu comme des tableaux de tableaux, ou encore pour un programme C comme un pointeur de pointeur.
Revenons rapidemment à la base de la représentation mémoire, quand on déclare un tableau genre
char monTableau[] = "ceci est une chaine de carac";
Au final, monTableau est un pointeur sur une zone mémoire continue de 29 octets (28 char de la chaine + la fin de chaine), le pointeur est donc l'adresse du début de cette zone mémoire.
Si maintenant on fait un tableau de tableau
char monTableau2dim[][]={"Chaine 1","chaine 2","chaine 4","chaine 5"}
Cela est équivalent à
char chaine1[] = "chaine1"; char chaine2[] = "chaine2";
char chaine3[] = "chaine3"; char chaine4[] = "chaine4";
char monTableau2dim[] = {"chaine1","chaine2","chaine3","chaine4"};
Bref on a donc monTableau2dim qui est un pointeur sur une zone mémoire qui contient 4 pointeurs vers des chaines de caractères. Chaque pointeur vers des chaines pointant lui même sur une autre zone mémoire de la bonne taille (8 octets a priori).
Pourquoi toutes ces explications? parce que maintenant on ne veut plus mettre le tableau en RAM mais en mémoire flash, pour cela on utilise PROGMEM qui le permet, mais après il faut utiliser des fonctions spéciales pour accèder aux données, puisque elles ne sont plus en RAM (pgm_read_XXX_YYY).
Hors dans notre cas présent on utilise
pgm_read_byte_near(anim[i][x]);
qui va lire la données en flash située à l'adresse du pointeur anim[i][x], mais ce pointeur est en fait un pointeur de pointeur de données toutes en mémoire flash.
Il faut donc utiliser les fonctions d'accès à la mémoire flash et non pas accéder au pointeur en RAM.
Bref pour résumer mon idée, il faut utiliser 2 fonctions pg_read_machin pour que ca retourne un caractère de l'animation.
il faut donc remplacer
pgm_read_byte_near(anim[i][x]);
par (et j'ai bien sur un doute sur l'ordre des pointeurs)
pgm_read_byte_near(((char*)pgm_read_word_near(&anim[i]))[x]);
Alors j'utilise un pgm_read_word_near parce que la on récupère le pointeur (et pas la valeur pointée) de l'animation voulue (anim[i]), comme c'est le pointeur, il faut mettre un & devant, et de mémoire un pointeur pour arduino fait 2 octets, d'ou la lecture d'un word et non un byte.