Boy that one is tricky, but I think I found a (physically correct) solution to the question. First of all, the Blend file:
EDIT: more flexible version here, Array now works in both directions:
screenshot here:
Desperately trying to rig this the whole afternoon with placing bones at the edges of the geometry, I decided to rather play origami instead. When I looked at the object in motion then, I noticed that the folding itself can be seen as triggered by one face rotating around the edge of its mirrored counterpart. Then I tried placing the first controller bone exactly perpendicular to that edge, and went on rigging from there:
The next Bone, Mech1, which is also perpendicular to the edge, copies the rotation from its parent, the controller bone, but inverts the result so it points back down instead of up. You also have to set the mode to Pose Space, Local Space won't work the same way:
Now two faces can already fold correctly. To continue, insert the same chain again for the next faces, but keep in mind that an intermediate bone is needed (Bone.003) to free the rotation channel of the next mech bone. Bone.003 is a child of Mech1, Mech1.001 a child of Controller.001. The bones simply copy the rotations of Controller and Mech1:
At this point I added an Armature and some weights to the mesh to see the movement of the first row of faces. Now the difficult part: Because of the qay I rigged it, the mesh starts to rotate in top view while folding. So Mirror and Array modifier have no simple axis to work on. For the mirror and array modifiers, we need two empties to act as center point and direction. To find the symmetry plane, I added two helper bones, which are childs of Controller and Controller.002. A MirrorAxis bone points from Track.Source to Track.Target using a TrackTo constraint:
I then created an empty and parented it to the MirrorAxis bone. Doing that, I get the correct orientation and location, and in the mirror modifier I now have an object, the empty, which I can feed into the stack:
At this point, the mesh is already mirrored correctly and can be tested. But it is not possible to use the same empty for the array, as the transformation is off and it has a rotation to it. So another helper bone is needed, which in the end has to point at the corner of the folded mesh all the time:
I used a Transformation constraint to get this to work. In Edit Mode i had placed the bone like it should be already. Then the logic is like this: Whenever the MirrorAxis bone receives a rotation by the TrackTo constraint, the Array.Target bone shall receive twice as much rotation (the mirror axis rotates by x, the mirrored bone has to rotate by 2 * x). To the tip of that bone I parented another empty, and used it in the Object Offset field of the array. Done!
I probably could have used a second array instead of a chain of bones for the first direction, but the idea came much later to me. If I had done that, the rig would be very flexible, as you can decide for each direction on how many faces you want. EDIT: I provided a second file which gets rid of unnecessary bones and gives you the choice on how many faces you want in both directions.