Donc finalement il faudrait des PNP sur la ligne du haut ?
Oui mais cela ne suffit pas. Avec des alimentations différentes le seul point commun est la masse et cela ne va pas convenir au PNP.
Un transistor bipolaire (NPN ou PNP) se commande par la jonction Base-Emetteur.
Dans ton application le NPN se commande entre la sortie de l'ATMega et le rail 0V, le PNP doit être commandé entre la la sortie de l'ATMega et le rail +12 Volts.
Il n'y a pas de problème pour le NPN mais il y en a un gros avec le PNP.
Le Montage_1 montre ce blocage.
Il y a toujours un moyen de contourner les problèmes :
Dans le montage_2 j'ai ajouté un transistor NPN qui s'interface avec le PNP. Cela va permettre de transférer le point de référence de la masse vers le +12 Volts.
Quand le NPN Q10 est bloqué aucun courant ne passe dans R11 et le PNP est bloqué, quand Q10 conduit les 12Volts se retrouve aux bornes de R11 et le PNP peut conduire.
Maintenant la tension peut monter jusqu'à 24 , 48Volts au besoin : attention quand même à choisir des transistors avec un Vceo supérieur à la "haute" tension.
EDIT : je viens de faire une recherche gogole "équivalent ULN2803 PNP"
Il existe un circuit UDN2981 qui incorpore le transistor NPN : il n'y a plus rien à ajouter:
Un UDN2981 et un ULN2803 et on obtient une matrice 8x8.